Koa对比Express
编程模型不同
- Express的中间件是线型的**
-
Koa的中间件是U型的(后面会讲)
对语言特性的使用不同
示例代码
记录返回hello world的总耗时
import Koa from 'koa'
const app = new Koa()
app.use(async (ctx, next) => {
// 空
await next();
const time = ctx.response.get('X-Response-Time'); // 读取response header
console.log(`${ctx.url} - ${time}`);
});
app.use(async (ctx, next) => {
const start = Date.now(); // 记录开始时间
await next();
const time = Date.now() - start; // 记录结束时间 - start = 总耗时
ctx.set('X-Response-Time', `${time}ms`); // 写到response header里
});
app.use(async ctx => {
ctx.body = 'Hello World';
// 最后一个中间件可以不写 await next()
});
app.listen(3000, ()=> {
console.log('listen 3000')
})
- 1后面的 await next() 会等待4执行完毕
- 2后面的 await next()会等待3执行完毕
await next()是什么意思
释义
app.use(async(ctx,next)=> {
const start = Date.now();
await next(); // 等待 下一个中间件()
const time = Date.now() - start;
ctx.set('X-Response-Time',`${time}ms`)
})
-
next()
表示进入下一个函数 - 下一个函数会返回一个
Promise
对象,称为p - 下一个函数所有代码执行完毕后,将p置为成功
-
await
会等待p成功后,再回头执行剩余的代码
await next()改写
改写成Promise 写法
app.use(async (ctx, next) => {
const start = Date.now();
return next().then(() => {
const time = Date.now() - start;
ctx.set('X-Response-Time', `${time}ms`)
})
})
- 定要写 return,因为中间件必返回 Promise对象
- 错误处理在这里写有点反模式,用
app.on('error')
更方便一点
文档在此
文档在此
文档在此
文档在此