如何在 Strapi 中间件中到达请求主体?

How do I reach request body in Strapi middleware?

我已经设法让中间件在 Strapi 中工作。但是,我在请求中看不到正文。

在 /middlewares/getEmail/index.js 里面,我有

module.exports = (strapi) => {
  return {
    initialize: function (cb) {
      strapi.app.use(async (ctx, next) => {
        if (ctx.method === "POST" && ctx.url === "/email-leads") {
          console.log(ctx);
        }
        await next();
      });
    },
  };
};

和 ctx 请求日志:

  request: {
    method: 'POST',
    url: '/email-leads',
    header: {
      'content-type': 'application/json',
      accept: 'application/json',
      'user-agent': 'PostmanRuntime/7.26.8',
      'postman-token': 'xxx',
      host: 'localhost:1337',
      'accept-encoding': 'gzip, deflate, br',
      connection: 'keep-alive',
      'content-length': '33'
    }
  },

这是我在此应用程序上编写的唯一中间件。在 /config/middleware.js 中,我有

module.exports = {
  load: {
    before: ["getEmail", "responseTime", "logger", "cors", "responses", "gzip"],
    order: ["parser"],
    after: ["router"],
  },
  settings: {
    getEmail: {
      enabled: true,
    },
  },
};

我读到这个 ​​koa-body/unparsed.js 来阅读正文,但 ctx.request 中几乎没有正文。感谢您的帮助。

所以,我已经找到了解决方案。发在这里以防其他人需要它。

config/middleware.js 中,我更改了负载,将自定义中间件带到 after 数组。

  load: {
    before: ["responseTime", "logger", "cors", "responses", "gzip"],
    after: ["parser", "router", "getEmail"],
  },

如果我登录 ctxctx.request,我仍然看不到 ctx.request.body。但是,如果我直接使用ctx.request.body,我可以达到它以防加载如上写(或在parser之后自定义中间件)。

如果你在 await next(); 行之前 console.log(ctx.request.body); 它会打印 undefined 因为 body 还没有加载。所以你有 2 个获取正文的选项。

  1. await next(); 行后使用 console.log(ctx.request.body);
  2. 从原始节点请求加载正文,如下例

Click Here