nodejs(2)—koa2(GET,POST)

  1. 安裝koa npm i koa@2.0.0或者在packge.json文件 dependencies字段中加入 "koa":"2.0.0"字段,npm install 當(dāng)前工程nodes_modules目錄中會自動添加koa模塊
  2. 新建app.js
  3. 在app.js中添加如下代碼
<!--引入的koa模塊是個class,所以首字母需要大寫-->
const Koa =require('koa');
const app=new Koa();
app.use(async (ctx,next)=>{
    console.log(`Process ${ctx.request.method} ${ctx.request.url} ....`);
    <!--next()函數(shù)必須要有 會繼續(xù)執(zhí)行下一個use-->
    await next(); 
});
app.use(async (ctx,next)=>{
    const {path,body}=ctx.request;
    if(path==='/test'){
        body='Test page'
    }else{
        await next();
    }
});
app.listen(3000);
console.log('app started at port 3000');

4.運(yùn)行 node app.js ,在控制臺上會顯示出app started at port 3000

上述代碼缺點(diǎn):新增鏈接都會再app.js文件中添加,導(dǎo)致后續(xù)代碼量越來越大荤牍,并且難以維護(hù)

  1. koa-router koa路由的作用是使url從代碼中分離出來码俩,單獨(dú)維護(hù)墨闲,不需要在異步函數(shù)中進(jìn)行判斷,安裝方式見1
<!--在上述代碼的基礎(chǔ)上添加-->
<!--(koa-router)返回的是函數(shù)-->
const router=require('koa-router')();
<!--改造app.use if(path==='/test')不需要在判斷-->
router.get('/test',async (ctx,next)=>{
    ......
});
  1. 上述只適用于get方式盟榴,post方式需要在安裝koa-bodyparser
<!--在上述代碼的基礎(chǔ)上添加-->
<!--post請求-->
const bodyParser=require('koa=bodyparser');
<!--新增一個url-->
router.post('/signin',async (ctx,next)=>{
    const {request,reponse}=ctx;
    const {name,password}=request.body;
    ......
})
  1. 上述改造雖然使代碼結(jié)構(gòu)更加清晰磺芭,但是比沒有解決最開始的app.js代碼量過多的問題有梆。要解決app.js代碼量過多的問題是尖,需要如下操作:

新建controllers.js文件,負(fù)責(zé)遍歷在controller文件夾下的以.js結(jié)尾的文件泥耀,并且引入文件添加在router中

const fs = require('fs');

function addMapping(router, mapping) {
    for (var url in mapping) {
        if (url.startsWith('GET')) {
            var path = url.substring(4);
            router.get(path, mapping[url]);
            console.log(`register url mapping:GET ${path}`);
        } else if (url.startsWith('POST')) {
            var path = url.substring(5);
            router.post(path, mapping[url]);
            console.log(`register URL mapping:POST ${path}`);
        } else {
            console.log(`invalid url:${url}`);
        }
    }
}

function addControllers(router) {
    const files = fs.readdirSync(__dirname + '/controllers');
    // 過濾出js文件
    const js_files = files.filter(f => {
        return f.endsWith('.js');
    });
    // 處理每個js文件
    for (var f of js_files) {
        console.log(`process controller:${f}`);
        // 引入js文件
        let mapping = require(__dirname + '/controllers/' + f);
        addMapping(router, mapping);
    }
}
module.exports = function(dir) {
    let controllers_dir = dir || 'controllers',
        router = require('koa-router')();
    addControllers(router, controllers_dir);
    return router.routes();
}

新建controller文件夾饺汹,js文件主要是異步處理函數(shù)

const fn_index=async (ctx,next)=>{
    ctx.response.body = `<h1>Index</h1>
    <form action='/signin' method='post'>
        <p>Name:<input name='name' value='koa'/></p>
        <p>Password:<input name='password' type='password'/></p>
        <p><input type='submit' value='submit'/></p>
    </form>`;
};
const fn_signin=async (ctx,next)=>{
    const { request, response } = ctx;
    const { name, password } = request.body;
    console.log(`sigin with name:${name},password:${password}`);
    if (name === 'koa' && password === '12345') {
      response.body = `<h1>Welcome,${name}</h1>`;
    } else {
      response.body = `<h1>Login failed!</h1>
          <p><a href='/'>Try again</a></p>`;
    }
};
const fn_hello=async (ctx,next) =>{
    const name=ctx.params.name;
    ctx.response.body=`<h1>Hello,${name}!</h1>`;
}
module.exports={
    'GET /':fn_index,
    'POST /signin':fn_signin,
    'GET /hello/:name':fn_hello
};
  1. 至此拆分結(jié)束 運(yùn)行node app.js
  2. git詳細(xì)代碼地址 https://github.com/jdkwky/webstudydeep/tree/webstudydeep/hello-koa

==參考:廖雪峰nodejs教程==

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痰催,隨后出現(xiàn)的幾起案子兜辞,更是在濱河造成了極大的恐慌,老刑警劉巖夸溶,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逸吵,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜘醋,警方通過查閱死者的電腦和手機(jī)胁塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來压语,“玉大人啸罢,你說我怎么就攤上這事√ナ常” “怎么了扰才?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厕怜。 經(jīng)常有香客問我衩匣,道長,這世上最難降的妖魔是什么粥航? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任琅捏,我火速辦了婚禮,結(jié)果婚禮上递雀,老公的妹妹穿的比我還像新娘柄延。我一直安慰自己,他們只是感情好缀程,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布搜吧。 她就那樣靜靜地躺著,像睡著了一般杨凑。 火紅的嫁衣襯著肌膚如雪滤奈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天撩满,我揣著相機(jī)與錄音蜒程,去河邊找鬼绅你。 笑死,一個胖子當(dāng)著我的面吹牛搞糕,可吹牛的內(nèi)容都是我干的勇吊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼窍仰,長吁一口氣:“原來是場噩夢啊……” “哼汉规!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驹吮,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤针史,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碟狞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啄枕,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年族沃,在試婚紗的時候發(fā)現(xiàn)自己被綠了频祝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡脆淹,死狀恐怖常空,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盖溺,我是刑警寧澤漓糙,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站烘嘱,受9級特大地震影響昆禽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝇庭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一醉鳖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哮内,春花似錦辐棒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泰涂。三九已至鲫竞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逼蒙,已是汗流浹背从绘。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人僵井。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓陕截,卻偏偏與公主長得像,于是被迫代替她去往敵國和親批什。 傳聞我的和親對象是個殘疾皇子农曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容