Body解析器使用来自另一个中间件的bodyParser中间件



所以,我正在开发这个快递应用程序,其中所有路线都有有限的车身尺寸,除非你是管理员,因为管理员需要几个路线都有无限的车身尺寸。我有limitBodySize中间件,我是这样使用它的: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参数传递给它们的匿名回调提供了一个错误,因此请正确处理这些错误。要做到这一点,最简单的方法之一是使用util模块来承诺每个中间件,因为您已经在链接它们了。

我怀疑您的请求体可能是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框架

使用ECMAScript 2017的asyncawait语法,您可以使其更容易阅读:

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)
}
}

最新更新