一、express 和 koa 的相同点:作者、功能……
Express:
2010年6月,TJ开始编写Express
2014年发展到v 0.12,基本成熟,移交StrongLoop
Koa:
2013年8月,TJ开始编写Koa
2015年8月,Koa发布v1.0.0版本
Node.js
2013年3月,Node.js v0.10 发布
2014年12月,io.js不满Node.js的管理发起分裂
2015年2月,Node.js v0.12发布
2015年9月,Node.js与io.js合并为Node.js v4.0(没有3.0版本,闹矛盾)
二、express 和 koa 的区别:对Node的支持、生态、中间件模型、API……
Koa时间点尴尬了,使用Koa就必须使用Node0.12版本,所以人们都不使用Koa
编程模型不同:
Express中间件是线形的
Koa中间件是U型的
对语言特性的使用不同
Express使用回调函数next()
Koa v1.x 使用 generator语法
Koa v2.x 使用async/await 语法
2017年之后建议使用Koa
Koa的中间件模型:
U形,请求开始,依次访问f1 f2...使用await next()进入下一个函数 ,再依次返回,最后响应
需要安装的工具:node-dev 代替node,代码已更新就自动重启
安装ts-node-dev代替ts-node,支持TS语言
代码
npm i -g node-dev ts-deno-dev
或者 yarn global add node-dev ts-deno-dev
注意:
如果用TS,需要运行 tsc --init 初始化 tsconfig.json
tsc的安装方法是全局安装[email protected]
你还需要安装 @types/koa
koa-demo-2
server.ts
yarn add koa
yarn add --dev @types/koa
tsc --init //创建tsconfig.json 文件
server.ts
import * as Koa from 'koa'
const app = new Koa()
app.use(async(ctx,next)=>{
ctx.body = 'hello'
await next()
ctx.body +='jirengu'
})
app.use(async(ctx,next)=>{
ctx.body +='world'
await next()
})
app.use(async(ctx)=>{
ctx.set('Content-Type','text/html;charset=utf-8')
})
app.listen(3000)
await next是什么:
next() 表示进入下一个函数
下一个函数会返回一个Promise对象p
下一个函数所有代码执行完毕后,将p置为成功
await会等待p成功后,再回头执行剩余的代码
//记录helloworld开始到结束用时:
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 改写成Promise写法:
//一定要写return 因为中间件必返回Promise对象
//错误处理在这里写有点反模式,用app.on('error')更方便一点
app.use(async(ctx,next)=>{
const start = Date.now();
return next().then(()=>{
const time = Date.now() -start;
ctx.set('X-Response-Time',`${time}ms`);
});
})
app.xxx //application
app.env //获取环境变量
app.proxy //环境代理
app.use(fn) //插入中间件
app.on('error',fn) //错误处理
app.emit //触发事件
ctx.xxx //context
ctx.req//Node.js 封装的请求
ctx.request //Koa 封装的请求
ctx.res
ctx.response
ctx.state //跨中间件分享数据 ctx.state.user={name:'frank'}
ctx.request.xxx
request.header
request.headers//与header一样的
request.method //请求的方法
request.path //请求的路径
request.query //参数
ctx.response.xxx
response.status
response.body *5//string \Buffer \Stream\Obj\null
response.set()*2 // key value或者对象
response.append //添加一个响应头