猿问

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

我对下面的代码有问题。当遇到错误时,会命中 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 响应)


精慕HU
浏览 121回答 3
3回答

慕村225694

你得到的错误是因为代码行  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 errorsteam.save(function (err) {    if (err) {        res.status(400).send(err);    }    res.status(200).json({        message: 'Team successfully created',        team: team    });});

Cats萌萌

您关于res.send()破坏的假设是不正确的,只有当您return. 调用return上res.send()的错误,使其不继续的情况下。如果你得到一个错误,它会将状态设置为 400(在标题中),然后是正文中的错误,但是因为它没有返回它然后尝试将状态设置为 200(在标题中)导致你的错误看到。// save the team and check for errorsteam.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().
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答