我已经创建了中间件来验证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 })
}
}