启用自定义中间件后Strapi后端异常,访问API和后台均返回404
问题原因
1. 配置文件格式错误
你将JS模块格式的配置写在了middleware.json文件中,JSON格式不支持module.exports语法,会导致Strapi加载中间件配置失败,后续路由逻辑无法正常初始化。
2. 中间件未正确处理异步逻辑
Koa基于洋葱模型实现中间件,next()方法返回Promise,必须通过await等待后续中间件执行完成。你原有代码直接调用next()没有等待,会导致中间件执行栈提前终止,后续路由匹配、业务逻辑都不会执行,直接返回404。
3. 未指定中间件加载顺序
Strapi v3需要显式指定自定义中间件的加载顺序,你没有配置加载顺序的情况下,中间件会默认挂载在路由中间件之后,请求完成路由匹配逻辑后才会进入你的中间件,此时已经走完路由判断逻辑,自然返回404。
修复方案
第一步:修改配置文件
将./config/middleware.json重命名为./config/middleware.js,替换内容为以下配置,显式指定你的中间件加载在路由逻辑之前:
module.exports = { load: { order: [ "addRequestId", "responseTime", "logger", "cors", "responses", "gzip", "poweredBy", "router", "favicon", "public", ] }, settings: { addRequestId: { enabled: true, }, }, };
第二步:修改中间件代码
适配异步逻辑,使用runPromise保证cls上下文在异步场景下正常生效,同时正确等待next()执行完成:
const { createNamespace } = require('cls-hooked'); const { v4: uuidv4 } = require('uuid'); const loggerNamespace = createNamespace('logger'); module.exports = (strapi) => { return { initialize() { strapi.app.use(async (ctx, next) => { const reqId = ctx.request.get('X-Request-Id') || uuidv4(); ctx.response.set('X-Request-Id', reqId); await loggerNamespace.runPromise(async () => { loggerNamespace.set('requestId', reqId); await next(); }); }); }, }; };
第三步:重启Strapi服务
修改完成后重启服务即可正常访问API与管理后台,同时请求会正常携带X-Request-Id响应头,cls上下文也可以正常获取requestId。
内容的提问来源于stack exchange,提问作者Baboo
相关产品推荐
相关产品推荐

