hello koa

337356674 8年前發布 | 20K 次閱讀 Node.js 開發

來自: http://www.jianshu.com/p/4603d4ed9a8b


NodeJS平臺上最熱門的框架莫非express了,但是似乎沒有用到es6中的優勢語法,于是express團隊又搞了一個叫koa的框架,支持es6,所以長遠地看,選擇koa才是王道。
對于我這樣一個很少寫js的人來說,一上手就開始使用koa,其實學習難度的曲線挺陡峭的,那再陡峭也得往上爬啊。。。

首先和koa認識一下,從這篇文檔中我們可以大致了解到koa是一個極簡的框架,連路由的功能都需要借助于第三方中間件。啥叫中間件?我目前的理解就是一個功能插件。使用koa-generator來新建一個項目試試看。

項目建好之后,打開項目根目錄下的app.js:

var app = require('koa')()
    // 導入中間件
    , koa = require('koa-router')()
    , logger = require('koa-logger')
    , json = require('koa-json')
    , views = require('koa-views')
    , onerror = require('koa-onerror');

// 路由
var index = require('./routes/index');
var users = require('./routes/users');

// 設置views的目錄和所使用的模板
app.use(views('views', {
    root: __dirname + '/views',
    default: 'jade'
}));
// 加入解析post請求中body的中間件
app.use(require('koa-bodyparser')());
// 加入解析json的中間件
app.use(json());
// 加入log記錄的中間件
app.use(logger());

// 收到請求時,先執行這個generator方法
app.use(function *(next){
    // 記錄開始的時間
    var start = new Date;
    // 掛起并執行next
    yield next;
    // 執行完next繼續執行,記錄耗時并打印
    var ms = new Date - start;
    console.log('%s %s - %s', this.method, this.url, ms);
});

// 設置靜態資源目錄
app.use(require('koa-static')(__dirname + '/public'));

// 定義路由
koa.use('/', index.routes(), index.allowedMethods());
koa.use('/users', users.routes(), users.allowedMethods());

// 使路由生效
app.use(koa.routes());

// 監聽錯誤
app.on('error', function(err, ctx){
    log.error('server error', err, ctx);
});

module.exports = app;

稍微做了一些注釋,可以看到app.js中都是項目設置的邏輯。

首先看看路由功能。

先將路由類導入

// 路由
var index = require('./routes/index');
var users = require('./routes/users');

然后定義路由

// 定義路由
koa.use('/', index.routes(), index.allowedMethods());
koa.use('/users', users.routes(), users.allowedMethods());

// 使路由生效
app.use(koa.routes());

此時我們訪問127.0.0.1:3000就路由到了./routes/index中,訪問127.0.0.1:3000/users就路由到了./routes/users中了。

打開./routes/users.js:

var router = require('koa-router')();

router.get('/', function *(next) {
    this.body = 'this a users response!';
});

module.exports = router;

發現router.get方法的第一個參數是'/',那么是否意味著get的第一個參數中可以省去'/users'?做個實驗:

將users.js中改為:

var router = require('koa-router')();

router.get('/', function *(next) {
    this.body = 'this a users response!';
});

router.get('/test', function *(next) {
    this.body = 'this a users test response!';
});

module.exports = router;

訪問127.0.0.1:3000/users/test,瀏覽器中顯示this a users test response!。bingo。

那么前面的猜想被證實了,那路由的邏輯我們就可以新建一個js來實現,而不需要修改app.js代碼,如此整體的項目結構也就清晰了。

在app.js中加入當前項目的路由類:test.js

var app = require('koa')()
    // 導入中間件
    , koa = require('koa-router')()
    , logger = require('koa-logger')
    , json = require('koa-json')
    , views = require('koa-views')
    , onerror = require('koa-onerror');

// 路由
var index = require('./routes/index');
var users = require('./routes/users');
var test = require('./routes/test');

// db
var db = require('./app/models/db/db');

// 設置views的目錄和所使用的模板
app.use(views('views', {
    root: __dirname + '/views',
    default: 'jade'
}));
// 加入解析post請求中body的中間件
app.use(require('koa-bodyparser')());
// 加入解析json的中間件
app.use(json());
// 加入log記錄的中間件
app.use(logger());

// 收到請求時,先執行這個generator方法
app.use(function *(next){
    // 記錄開始的時間
    var start = new Date;
    // 掛起并執行next
    yield next;
    // 執行完next繼續執行,記錄耗時并打印
    var ms = new Date - start;
    console.log('%s %s - %s', this.method, this.url, ms);
});

// 設置靜態資源目錄
app.use(require('koa-static')(__dirname + '/public'));

// 定義路由
koa.use('/', index.routes(), index.allowedMethods());
koa.use('/users', users.routes(), users.allowedMethods());
koa.use('/test', test.routes(), test.allowedMethods());

// 使路由生效
app.use(koa.routes());

// 監聽錯誤
app.on('error', function(err, ctx){
    log.error('server error', err, ctx);
});

module.exports = app;

如此,所有127.0.0.1:3000/test開始的地址都將被路由到test.js中。

 本文由用戶 337356674 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!