koa-router 在 ctx 获取不到 params

2024 年 12 月 11 日 星期三(已编辑)
/
2
这篇文章上次修改于 2024 年 12 月 11 日 星期三,可能部分内容已经不适用,如有疑问可询问作者。

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

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
  },
})

看到控制台可以分别拿到 pathquery等参数的信息

缺点:每次想要进行参数校验的时候,在每个控制器路由请求都需要绑定中间件(太麻烦),可以抽离之前的校验,分成 path参数校验和其他(headerquery)参数校验,将 path参数校验逻辑抽离成一个新的中间件 apiPathVerify,在需要进行一些路径参数校验的控制器进行校验即可。

调整参数校验中间件执行顺序

问题的产生是因为 洋葱模型 中的加载,全局中间件会比路由中间件先加载,所以可以修改等路由加载完再来进行参数校验。

总结

  1. 如果执行顺序不想改变的可以抽离单独的 path 校验中间件,在单独需要进行校验的 api 进行拦截
  2. 如果不想改动太大代码的修改校验执行时机

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...