gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:22:59 25 4
gpt4 key购买 nike

所以,我正在开发这个快速应用程序,其中所有路线的主体大小都受到限制,除非您是管理员,因为管理员需要对多条路线无限的主体大小。我有 limitBodySize 中间件,并且像这样使用它: app.use(middleware.limitBodySize)

但最终我的 body 没有被解析,一切都未定义。

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 promise 每个中间件。模块,因为无论如何你已经链接它们了。

我怀疑您的请求正文可能是 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)
}
}

关于javascript - Body 解析器使用来自另一个中间件的 bodyParser 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com