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
.
我正在使用 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
.