介紹
Express
- Express 是第一代最流行的web框架,對 Node.js 的 http 進行了封裝。
- Express 的 API 很簡單,但是它是基于 ES5 的語法,要實現(xiàn)異步代碼,只有一個方法:回調(diào)。如果異步嵌套層次過多,代碼寫起來就非常難看。
Koa
- Koa 是 Express 的下一代 web 框架,它是基于 Node. js 開發(fā)的web框架。
- Koa 現(xiàn)在暫時有兩個版本:Koa 1.x 和 Koa 2.0。
- Koa 1.0 使用Generator 實現(xiàn)異步,代碼看起來像同步的;Koa 2 完全使用 Promise 并配合 async (await) 來實現(xiàn)異步。
Koa 1
var koa = require('koa');
var app = koa();
app.use('/test', function *() {
yield doReadFile1();
var data = yield doReadFile2();
this.body = data;
});
app.listen(3000);
Koa 2
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
await next();
var data = await doReadFile();
ctx.response.type = 'text/plain';
ctx.response.body = data;
});
app.listen(3000);
Generator 函數(shù)和 async 函數(shù)
Generator 函數(shù)和 async 函數(shù)的最大區(qū)別是 Generator 函數(shù)不能自動執(zhí)行,需借助 co 函數(shù)庫(如下代碼),而 async 函數(shù)可以當作普通函數(shù)直接使用。
// Generator 函數(shù),用于依次讀取兩個文件
var gen = function* (){
var f1 = yield readFile('/etc/fstab');
var f2 = yield readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};
//Generator 函數(shù)只要傳入 co 函數(shù),就會自動執(zhí)行。
var co = require('co');
co(gen);
//co 函數(shù)返回一個 Promise 對象,因此可以用 then 方法添加回調(diào)函數(shù)。
co(gen).then(function (){
console.log('Generator 函數(shù)執(zhí)行完成');
})