You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用自定义中间件后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:06:08