为了账号安全,请及时绑定邮箱和手机立即绑定

错误:发送后无法设置标头 - 正确处理快速控制器中的错误

错误:发送后无法设置标头 - 正确处理快速控制器中的错误

精慕HU 2021-06-09 09:24:51
我对下面的代码有问题。当遇到错误时,会命中 if 语句并调用 res.send。但是,代码然后继续到下面的 res.json 调用。这会导致标题错误。使用 else 语句是唯一正确的方法吗?我认为调用 res.send 会中断函数。exports.new = function (req, res) {    let team = new Team();    team.name = req.body.name;    team.description = req.body.description;    team.members = [];    // save the team and check for errors    team.save(function (err) {        if (err) {            res.status(400).send(err);        }        res.status(200).json({            message: 'Team successfully created',            team: team        });    });};我也尝试过使用 req、res、next 作为函数参数并使用以下方法:if (err) {    res.status(400);    next(err);}res.status(200).json({    message: 'Team successfully created',    team: team});虽然这不会引发错误,但它仍然继续调用最终的 res.status.json(导致 200,而不是 400 响应)
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

你得到的错误是因为代码行


  res.status(200).json({

    message: 'Team successfully created',

    team: team

});

无论是否出错,都会被调用。如果出现错误,则 express 已经在此代码中发送了响应标头


if (err) {

    res.status(400).send(err);

}

所以当 express 尝试下面的代码时,它会得到你表达的错误。答案是使用 Rami Jarrar 提供的答案


 // save the team and check for errors

team.save(function (err) {

    if (err) {

        res.status(400).send(err);

    }


    res.status(200).json({

        message: 'Team successfully created',

        team: team

    });

});


查看完整回答
反对 回复 2021-06-18
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您关于res.send()破坏的假设是不正确的,只有当您return. 调用return上res.send()的错误,使其不继续的情况下。如果你得到一个错误,它会将状态设置为 400(在标题中),然后是正文中的错误,但是因为它没有返回它然后尝试将状态设置为 200(在标题中)导致你的错误看到。


// save the team and check for errors

team.save(function (err) {

    if (err) {

        // return here so that it will not continue!

        return res.status(400).send(err);

    }


    // return here if there is no error!

    return res.status(200).json({

        message: 'Team successfully created',

        team: team

    });

});

Express 将中间件链接在一起使用function(req, res, next),并且可以通过res.send()多个中间件返回结果。链中的下一个中间件在您调用时调用return next(),因此,例如,如果您想在成功时返回另一个中间件中的附加数据,则不会return res.send()而是return next()在res.send().


查看完整回答
反对 回复 2021-06-18
  • 3 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信