Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 错误:Can';t在发送后设置标头-正确处理express控制器中的错误_Javascript_Node.js_Express - Fatal编程技术网

Javascript 错误:Can';t在发送后设置标头-正确处理express控制器中的错误

Javascript 错误:Can';t在发送后设置标头-正确处理express控制器中的错误,javascript,node.js,express,Javascript,Node.js,Express,我对下面的代码有问题。命中错误时,将命中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;

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

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

在您的情况下,只要在出现错误时添加
return

if (err) {
    return res.status(400).send(err);
}

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

在您的情况下,只要在出现错误时添加
return

if (err) {
    return res.status(400).send(err);
}

因为在发送状态的错误情况下不会返回,所以下面的代码无论如何都会在错误之后执行

您需要编写:
返回res.status(400).send(err)

或者只需使用
if-else

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

您需要编写:
返回res.status(400).send(err)

或者只需使用
,如果else

您对
res()的假设不正确。send()
中断,则只有在您
返回
时才会执行此操作。如果出现错误,请调用
res.send()
上的
return
,使其无法继续。如果您收到错误,它会将状态设置为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使用
函数(req,res,next)
将中间件链接在一起,并且可以通过多个中间件中的
res.send()
返回结果。当您
返回下一个()
时,会调用链中的下一个中间件,因此,如果您希望在成功时在另一个中间件中返回其他数据,则不会
返回res.send()
,而是在
res.send()
之后调用
返回下一个()
您对
res.send()的假设是不正确的
breaking,只有当您
返回时它才会这样做。如果出现错误,请调用
res.send()
上的
return
,使其无法继续。如果您收到错误,它会将状态设置为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使用
函数(req,res,next)
将中间件链接在一起,并且可以通过多个中间件中的
res.send()
返回结果。当您
返回下一个()
时,会调用链中的下一个中间件,因此,如果您希望在成功时在另一个中间件中返回其他数据,则不会
返回res.send()
,而是在
res.send()之后调用
返回下一个()

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

  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
    });
});

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

  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
    });
});
请尝试以下方法:

team.save(function (err) {
    if (err) {
        return res.status(400).send(err); // here i have added a return
    }

    res.status(200).json({
        message: 'Team successfully created',
        team: team
    });
}
问题是,当我们向客户端发送响应时,tcp连接将关闭,再次在同一响应对象上发送数据将抛出当前代码中的错误。

请尝试以下操作:

team.save(function (err) {
    if (err) {
        return res.status(400).send(err); // here i have added a return
    }

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

问题是,当我们将响应发送到客户端时,tcp连接将关闭,再次在同一响应对象上发送数据将抛出当前代码中的错误。

res.send()
不会中断,express使用传递到
中间件的
next()
将中间件处理程序链接在一起(req,res,next)
。可以从多个处理程序调用
res.send()
,这可能就是您的情况。实际上,您可能出现了一个错误,然后尝试设置标题/状态。
res.send()
不会中断,请使用
next()将中间件处理程序快速链接在一起
传递给
中间件(req,res,next)
。可以从多个处理程序调用
res.send()
,这可能就是您的情况。实际上,您可能出现错误,然后尝试设置标头/状态。