首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >错误:无法在发送后设置标头-正确处理express控制器中的错误

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

Stack Overflow用户
提问于 2019-06-03 00:28:02
回答 5查看 63关注 0票数 0

我对下面的代码有一个问题。当命中错误时,将命中if语句并调用res.send。但是,代码随后继续执行下面的res.json调用。这会导致报头错误。

使用else语句是唯一正确的方法吗?我假设调用res.send会中断函数。

代码语言:javascript
复制
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作为函数参数,并使用以下方法:

代码语言:javascript
复制
if (err) {
    res.status(400);
    next(err);
}

res.status(200).json({
    message: 'Team successfully created',
    team: team
});

虽然这不会抛出错误,但它仍然继续调用最终的res.status.json (结果是200,而不是400 )

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-06-03 00:32:18

不能在调用res.end之后发送响应,这是在调用res.send函数时由express在内部完成的

在本例中,只需在出现错误时添加return

代码语言:javascript
复制
if (err) {
    return res.status(400).send(err);
}
票数 2
EN

Stack Overflow用户

发布于 2019-06-03 00:33:23

因为在发送状态的错误情况下不会返回,所以下面的代码只是在之后执行。

你需要写:return res.status(400).send(err);或者直接使用if else

票数 0
EN

Stack Overflow用户

发布于 2019-06-03 00:33:23

你关于res.send()破坏的假设是不正确的,只有当你return的时候它才会这样做。在发生错误的情况下调用res.send()上的return,这样它就不会继续执行。如果你得到一个错误,它会将状态设置为400 (在标题中),然后主体中的错误,但因为它不返回它,然后尝试将状态设置为200 (在标题中),从而导致您看到的错误。

代码语言:javascript
复制
// 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(),而是在res.send()之后调用return next()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56416862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档