Javascript 主体解析器使用来自另一个中间件的主体解析器中间件
所以,我正在开发这个express应用程序,其中所有路线的体型都是有限的,除非你是管理员,因为管理员需要几个路线的体型是无限的。我有limitBodySize中间件,我是这样使用的:Javascript 主体解析器使用来自另一个中间件的主体解析器中间件,javascript,node.js,express,middleware,body-parser,Javascript,Node.js,Express,Middleware,Body Parser,所以,我正在开发这个express应用程序,其中所有路线的体型都是有限的,除非你是管理员,因为管理员需要几个路线的体型是无限的。我有limitBodySize中间件,我是这样使用的:app.use(middleware.limitBodySize) 但最终我的身体没有被解析,一切都没有定义 limitBodySize: (req, res, next) => { let admin = true; // removed extra steps for simplicity if
app.use(middleware.limitBodySize)
但最终我的身体没有被解析,一切都没有定义
limitBodySize: (req, res, next) => {
let admin = true; // removed extra steps for simplicity
if (admin) {
bodyParser.urlencoded({ extended: false })(req, res, () => {
console.log(req.body) // logs undefined
bodyParser.json()(req, res, () => {
console.log(req.body) // logs undefined
next(); // in next route, console.log(req.body) logs undefined
});
});
} else {
bodyParser.urlencoded({ extended: false, limit: '1kb' })(req, res, () => {
bodyParser.json({ limit: '1kb' })(req, res, () => {
next();
});
});
}
}
只有一个中间件,而不是将bodyParser中间件分别传递给每个路由或路由器,我如何解决这个问题。首先,您应该在自定义条件中间件之外生成
bodyParser
中间件,因为它是可重用的
您也没有检查错误;您的bodyParser
中间件可能向作为next
参数传递给它们的匿名回调提供了错误,因此请正确处理错误。实现这一点的最简单的方法之一是使用模块对每个中间件进行说明,因为您已经在链接它们了
我怀疑您的请求主体可能是JSON,而urlencoded
中间件正试图解析它,但未成功。此时,bodyParser
已经消耗了主体流,因此json
中间件也可能会失败。由于您忽略了这两个错误,因此在尝试以下操作之前,您无法确定下一个修复是什么:
const { promisify } = require('util')
const json = promisify(bodyParser.json())
const limitedJson = promisify(bodyParser.json({ limit: '1kb' }))
const urlencoded = promisify(bodyParser.urlencoded({ extended: false }))
const limitedUrlencoded = promisify(bodyParser.urlencoded({ extended: false, limit: '1kb' }))
...
limitBodySize: (req, res, next) => {
...
if (admin) {
urlencoded(req, res).then(
() => json(req, res)
).then(
() => next(),
next
)
} else {
limitedUrlencoded(req, res).then(
() => limitedJson(req, res)
).then(
() => next(),
next
)
}
}
这将使用.then()的onRejected
参数将任何错误传递给express framework
使用ECMAScript 2017的async
和await
语法,您可以使其更易于阅读:
limitBodySize: async (req, res, next) => {
...
try {
if (admin) {
await urlencoded(req, res)
await json(req, res)
} else {
await limitedUrlencoded(req, res)
await limitedJson(req, res)
}
next()
} catch (error) {
// if error occurs here, you probably need to figure out what your next issue is
next(error)
}
}
我试过你的代码,了解到我面临的一个错误,首先,默认的bodyParser限制是100kb,我的请求超出了这个限制,第二个问题是我发送的文件返回了太多的参数错误,所以我增加了parameterLimit,现在catch没有给出任何错误,但身体是变形的,看起来像这样,知道为什么吗?{'----WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;名称':““名称”\r\n\r\n名称,\r\n----WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;名称=“说明”\r\n\r\n描述,\r\n----WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;名称=“营养信息”\r\n\r\n营养信息,\r\n------WebKitFormBoundaryS8lANGAVimhAaXy2\r\n内容配置:表单数据;name=“price”\r\n\r\n价格\r\n------WebKitFormBoundaryS8lANGAVimhAaXy2-\r\n'},这就是我现在使用的:const json=promisify(bodyParser.json({limit:'100mb');const limitedJson=promisify(bodyParser.json({limit:'1kb'}));const urlencoded=promisify(bodyParser.urlencoded({extended:false,limit:'100mb',parameterLimit:1000000}));const limitedurlencode=promisify(bodyParser.urlencoded({extended:false,limit:'1kb'}));天哪,问题是我正在尝试发送多部分表单,也就是说,我只需要模块来处理多部分表单,这就是为什么你们和我的示例无法工作的原因。。。谢谢你