前端迈向架构师第一步-快速了解koa框架-4

190 阅读2分钟
「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

image.png

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;
}