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