koa-router 在 ctx 获取不到 params
原因
ctx.params 是由 koa-router注入的,但 koa-router是一个路由中间件,而 api-params-verify是全局中间件,在执行顺序上全局中间件早于路由中间件,所以获取不到 ctx.params
解决方案
将全局中间件改为改为路由中间件
取消全局中间件的加载

在具体需要进行校验的路由控制器绑定参数校验中间件(apiParamsVerify)
module.exports = (app, router) => {
const { project: projectController } = app.controller;
const apiParamsVerify = app.middlewares.apiParamsVerify;
router.get("/api/project/list/:params_data/list", apiParamsVerify, projectController.getList.bind(projectController));
}简单的发送请求验证结果
axios.request({
method: 'get',
url: '/api/project/list/2/list',
params: {
params_data_1: 1
},
})
看到控制台可以分别拿到 path、query等参数的信息
缺点:每次想要进行参数校验的时候,在每个控制器路由请求都需要绑定中间件(太麻烦),可以抽离之前的校验,分成 path参数校验和其他(header、query)参数校验,将 path参数校验逻辑抽离成一个新的中间件 apiPathVerify,在需要进行一些路径参数校验的控制器进行校验即可。
调整参数校验中间件执行顺序

问题的产生是因为 洋葱模型 中的加载,全局中间件会比路由中间件先加载,所以可以修改等路由加载完再来进行参数校验。
总结
- 如果执行顺序不想改变的可以抽离单独的
path校验中间件,在单独需要进行校验的api进行拦截 - 如果不想改动太大代码的修改校验执行时机