Express.js中间件ERR_HTTP_HEADERS_SENT错误的原因



我已经创建了中间件来验证body中的字段,下面是它的样子:

前端路线:

router.post('/s-i', async (req, res) => {
try {
const { data } = await api.post('/sign-in', req.body)
res.cookie("_rt", data._rt, { httpOnly: true, secure: false })
delete data._rt
return res.json(data)
} catch (e) {
// Here is error
return res.status(e.response.status).json(e.response.data)
}
});

路线(后端):

router.post('/sign-in', v(['email', 'password', 'twoFa', 'phone']), wrapAsync(userController.signIn));

中间件:

exports.v = fields => {
return (req, res, next) => {
fields.forEach(field => {
if (req.body[field]) {
const result = require(`./validators/${field}`)(req.body[field])
if (!result)
return res.status(400).json({ message: 'bad-request', status: 400 })
}
})
next()
}
}

在放置注释的地方,我可以看到这个错误,实际上,一切都可以找到,如果在正文前面有错误的字段将收到400状态码,但在后端我仍然有这个错误,不能得到为什么。

问题是我仍然得到这个ERR_HTTP_HEADERS_SENT错误。我知道这个问题的原因-例如-如果你试图做res.send({})两次,但我真的不知道在这种情况下问题的原因。

return res.status(400)...语句只从内部函数fields.forEach(field => {...})返回,必须从中间件函数返回,否则next()会在.json输出后调用后续中间件,导致观察到的错误

您可以通过将fields.forEach(field => {...})替换为

来实现这一点
for (var field of fields) {
if (req.body[field]) {
const result = require(`./validators/${field}`)(req.body[field])
if (!result)
return res.status(400).json({ message: 'bad-request', status: 400 })
}
}

相关内容