| 「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」 |
|---|
Koa 洋葱圈模型,即最先访问的路由里的next()后面的代码最后响应
中间件的设置是通过Koa( )生成的Application对象的use方法,看下这个方法的定义
use(fn) {
if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
if (isGeneratorFunction(fn)) {
deprecate('Support for generators will be removed in v3. ' +
'See the documentation for examples of how to convert old middleware ' +
'https://github.com/koajs/koa/blob/master/docs/migration.md');
fn = convert(fn);
}
debug('use %s', fn._name || fn.name || '-');
this.middleware.push(fn);
return this;
}
本文我们来了解一下koa的中间件:
koa-compose集成中间件:把middleware方法们串联起来。koa-compress压缩数据中间件koa-json-error处理错误中间件koa-parameter校验参数中间件
使用koa-compose集成中间件
import koa from 'koa'
import path from 'path'
import helmet from 'koa-helmet'
import statics from 'koa-static'
import router from './routes/routes'//合并路由后的routers.js
import koaBody from 'koa-body'
import jsonutil from 'koa-json'
import cors from '@koa/cors'
import compose from 'koa-compose'
const app = new koa()
// app.use...
// app.use(helmet())
// app.use(statics(path.join(__dirname, '../public')))
// app.use(router())
const middleware = compose([
koaBody(),
statics(path.join(__dirname,'../public')),
cors(),
jsonutil({pretty: false, param:'pretty'}),
helmet()
])
app.use(middleware)
app.use(router())
app.listen(3000);
koa-compress压缩数据
import koa from 'koa'
import path from 'path'
import helmet from 'koa-helmet'
import statics from 'koa-static'
import router from './routes/routes'//合并路由后的routers.js
import koaBody from 'koa-body'
import jsonutil from 'koa-json'
import cors from '@koa/cors'
import compose from 'koa-compose'
import compress from 'koa-compress'
const app = new koa()
const isDevMode=process.env.NODE_ENV==='production'?false:true
const middleware = compose([
koaBody(),
statics(path.join(__dirname,'../public')),
cors(),
jsonutil({pretty: false, param:'pretty'}),
helmet()
])
if(!isDevMode){
app.use(compress())
}
app.use(middleware)
app.use(router())
app.listen(3000);
koa-json-error处理错误
// 安装:npm i koa-json-error
// windows环境可能需要安装cross-env来配置环境变量
// 配置koa-json-error,让其在生产环境下不打印堆栈信息
const error = require("koa-json-error");
// 在生产环境不返回错误堆栈信息
app.use(
error({
postFormat: (error, { stack, ...rest }) =>
process.env.NODE_ENV === "production" ? rest : { stack, ...rest },
})
);
koa-parameter校验参数
// 1.安装 npm i koa-parameter
1. 使用
// app.js
app.use(parameter(app));
// controllers/users.js
async create(ctx) {
ctx.verifyParams({
name: { type: "string", required: true },
password: { type: "string", required: true },
});
const { name } = ctx.request.body;
const repeatedUser = await User.findOne({ name });
if (repeatedUser) {
ctx.throw(409, "用户名已经占用");
}
const user = await new User(ctx.request.body).save();
ctx.body = user;
}