bodyParser 未在 Sails.js 中执行验证选项

bodyParser not executing verify option in Sails.js

我正在使用 body-parser 来解析 Sails.js 中的数据。但是没有在 bodyParser.json().

中执行验证选项

这是我在 config/http.js 文件中的中间件配置:

module.exports.http = {
 middleware: {

    order: [
      "cookieParser",
      "session",
      "bodyParser",
      "fileMiddleware",
      "router",
      "www",
      "favicon",
    ],

    bodyParser: (function () {
      const bodyParser = require("body-parser");
      console.log("body-parser executing");
      bodyParser.json({
        limit: "50MB",
        // for verifyingShopifyWebhook
        verify: function(req, res, buf, encoding) {
          console.log("buf", buf); //not getting printed on console
          if (req.url.search("/shopify/webhooks") >= 0) {
              console.log("inside bodyParser verify");
              req.rawbody = buf;
          }
        }
      });
      bodyParser.urlencoded({ limit: "50MB", parameterLimit: 100000, extended:true });
      return bodyParser();
    })(),

    fileMiddleware: (function (){
      const multer = require("multer");
      const upload = multer();
      return upload.fields([{ name: "tagsFile", maxCount: 1 }]);
    })(),
  },
};

当我试图在控制器函数中访问它时,我得到 req.rawbody 作为 undefined,它甚至没有打印 buf 对象,所以它似乎根本没有调用验证函数。

此外,由于每个请求都需要调用中间件,那么为什么 App 只在启动时打印 body-parser executing 而不是在每个请求调用时打印?

好的,参考skipper代码,终于找到答案了

这是我对我的 body-parser 中间件所做的:

bodyParser: (function () {
  const bodyParser = require("body-parser");
  const JSONBodyParser = bodyParser.json({
      limit: "50MB",
      // for verifyingShopifyWebhook
      verify: function(req, res, buf, encoding) {
        if (req.url.search("/shopify/webhooks") >= 0) {
            console.log("inside bodyParser verify");
            req.rawbody = buf;
        }
      }
    });
    const URLEncodedBodyParser = bodyParser.urlencoded({ limit: "50MB", parameterLimit: 100000, extended:true });

    return function(req, res, next){
      if(req.is("application/x-www-form-urlencoded")){
        return URLEncodedBodyParser(req, res, next);
      } else {
        return JSONBodyParser(req, res, next);
      }
    }
})()

因此,我们需要 return 特定的解析器,而不是 returning bodyParser()

这里,如果类型是x-www-form-urlencoded那么就会returnURLEncodedBodyParser,否则就会return JSONBodyParser.