启用自定义中间件时 Strapi 后端损坏

Strapi backend broken when enable custom middleware

我创建了一个自定义中间件,当我启用它时,它使 api 和管理员无法访问。

中间件非常简单,它为服务器上的传入请求添加一个请求 ID:

const { createNamespace } = require('cls-hooked');
const { v4: uuidv4 } = require('uuid');

const loggerNamespace = createNamespace('logger');

module.exports = (strapi) => {
  return {
    initialize() {
      strapi.app.use((ctx, next) => {
        const reqId = ctx.request.get('X-Request-Id') || uuidv4();

        ctx.response.set('X-Request-Id', reqId);

        loggerNamespace.run(() => {
          loggerNamespace.set('requestId', reqId);

          next();
        });
      });
    },
  };
};

使用配置文件启用./config/middleware.json:

module.exports = {
  settings: {
    addRequestId: {
      enabled: true,
    },
  },
};

然后,启用后,调用 API 端点或尝试连接到管理员会导致 404 未找到。

我将 strapi 3.6.8 与节点 14.18.1 一起使用。

知道为什么吗?

PS:我怀疑 cls-hooked 是罪魁祸首,但删除它以使用贫血中间件进行测试也不起作用。

@Salvino 让我走上正轨,建议我等待 next.

的执行

cls-hooked的代码中挖掘,我找到了类似于run的方法runPromise和returns一个可以等待的Promise .它解决了这个问题。

固定码:

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