前面我们已经学习了express,另外一个非常流行的Node Web服务器框架就是Koa。
Koa官方的介绍:
事实上,koa是express同一个团队开发的一个新的Web框架:
事实上学习了express之后,学习koa的过程是很简单的;
我们来体验一下koa的Web服务器
koa注册的中间件提供了两个参数:
ctx:上下文(Context)对象;
koa并没有像express一样,将req和res分开,而是将它们作为ctx的属性;
ctx代表依次请求的上下文对象;
ctx.request:获取请求对象;
ctx.response:获取响应对象;
next:本质上是一个dispatch,类似于之前的next;
后续我们学习Koa的源码,来看一下它是一个怎么样的函数;
koa通过创建的app对象,注册中间件只能通过use方法:
但是真实开发中我们如何将路径和method分离呢?
koa官方并没有给我们提供路由的库,我们可以选择第三方库:koa-router
我们可以先封装一个 user.router.js 的文件:
注意:allowedMethods用于判断某一个method是否支持:
安装依赖: npm install koa-bodyparser;
使用 koa-bodyparser的中间件;
const path = require('path')
const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
const multer = require('koa-multer')
const app = new Koa()
const Router = require('koa-router')
const uploadRouter = new Router({prefix: '/upload'})
app.use(bodyParser())
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, './uploads/')
},
filename: (req, file, cb) => {
cb(null, Date.now() + path.extname(file.originalname))
},
})
const upload = multer({
storage
})
// app.use(upload.any())
uploadRouter.post('/avatar', upload.single('avatar'), (ctx, next) => {
console.log(ctx)
console.log(ctx.req.file)
ctx.response.body = 'upload success~'
})
app.use(uploadRouter.routes())
// userRouter.post('/products', (ctx, next) => {
// console.log(ctx.request.url)
// console.log(ctx.request.body)
//
// ctx.response.body = 'hello world~'
// })
// app.use((ctx, next) => {
// console.log(ctx.request.url)
// console.log(ctx.request.query)
// console.log(ctx.query)
// ctx.response.body = 'hello world~'
// })
// app.use(userRouter.routes())
app.listen(8000, () => {
console.log('koa服务器启动成功!')
})
koa并没有内置部署相关的功能,所以我们需要使用第三方库:
npm install koa-static
在学习了两个框架之后,我们应该已经可以发现koa和express的区别:
所以,接下来,我们再来研究一下express和koa中间件的执行顺序问题;
我通过一个需求来演示所有的过程:
假如有三个中间件会在一次请求中匹配到,并且按照顺序执行;
我希望最终实现的方案是:
实现方案:
2. Express同步数据的实现;
const express = require('express')
const axios = require('axios')
const app = express()
const middleware1 = async (req, res, next) => {
req.message = 'aaa'
next()
const message = await middleware3(req.message)
console.log(message)
res.end(message.toString())
}
const middlewar2 = async (req, res, next) => {
req.message += 'bbb'
}
const middleware3 = async (msg) => {
const result = await axios.get('http://123.207.32.32:9001/lyric?id=167876')
msg += result.data.lrc.lyric
console.log(msg)
return msg
}
app.use(middleware1, middlewar2)
app.listen(8000, () =>{
console.log('express服务器启动成功')
})