【问题标题】:Strapi backend broken when enable custom middleware启用自定义中间件时 Strapi 后端损坏
【发布时间】:2021-11-19 20:54:30
【问题描述】:

我创建了一个自定义中间件,当我启用它时,它会导致 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 Not Found。

我使用带有节点14.18.1 的strapi 3.6.8

知道为什么吗?

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

【问题讨论】:

  • 您可以尝试使用await next() 而不是仅使用next() 吗?哦,另外,您可能必须将传递给run 方法的回调函数标记为async
  • 我试过但效果不佳
  • 这是一个很好的建议,但我发现我应该等待 run 使用 runPromise

标签: javascript strapi


【解决方案1】:

@Salvino 让我走上正轨,建议我等待next 的处决。

挖掘cls-hooked的代码,发现runPromise方法类似于run,返回一个可以等待的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();
        });
      });
    },
  };
};

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2018-12-26
    • 2018-08-06
    • 1970-01-01
    • 2017-08-05
    • 2011-08-05
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多