Node.js 在接到客户机同时呼叫时快速中断

Node.js 在接到客户机同时呼叫时快速中断,node.js,http,express,Node.js,Http,Express,由于客户端中的错误,每次发送表单时,我的node/express API都会两次同时收到完全相同的PUT请求 作为响应,服务器总是崩溃,出现以下错误: Error: Can't set headers after they are sent 现在我修复了客户端,这样服务器就不会再崩溃了,但我想正确地修复API。任何人都可以通过同时发送两个PUT请求来杀死我的服务器 因此,我的问题是: 如何最好地处理Express中的“无法设置标题”错误 我的服务器代码中的错误是什么导致了错误的发生 这是我

由于客户端中的错误,每次发送表单时,我的node/express API都会两次同时收到完全相同的PUT请求

作为响应,服务器总是崩溃,出现以下错误:

Error: Can't set headers after they are sent
现在我修复了客户端,这样服务器就不会再崩溃了,但我想正确地修复API。任何人都可以通过同时发送两个PUT请求来杀死我的服务器

因此,我的问题是:

  • 如何最好地处理Express中的“无法设置标题”错误
  • 我的服务器代码中的错误是什么导致了错误的发生
这是我的服务器代码:

server.js

deal.js

更新:

错误来自于我如何声明一个全局r,以便在外部为所有方法调用一个响应

我通过对每个方法都有一个响应回调来修复它


还想知道我是否可以用绑定(res)来代替吗?

您错过了一个返回,因此当出现错误时,您调用了
res.send
两次。返回后,执行将在第一次返回后停止

我知道你想为你的后续问题做些什么,但是创建一个全局变量
r
肯定是不是一个好方法。我这样做的方式是将
res
传递给后续函数-见下文。也许有更好的办法,但至少这似乎是合理的

exports.update = function(req, res) {
  var u = {
    $set: {}
  }
  for(var x in req.body){
    if (['name','stages'].indexOf(x)>=0)
    u.$set[x] = req.body[x];
  }
  Pipeline // this is a mongoose object
    .findOneAndUpdate({'_id.id':req.params.id},u,{new:true})
    .exec(function(err, data) { respond(err, data, res) });
}

function respond(err, data, res) {
  if (err) {
    return res.send(err);
  }

  return res.json(data);

}

谢谢,这很有道理,我更新了我的代码。但仍然没有修复,exec没有给出err。我认为您需要查看代码中的其他地方。您可以尝试节点检查器来跟踪发生的情况Hanks,我发现了一个错误,因为我没有一字不差地粘贴代码,这是我的错。你能帮我打捆吗?我接受你的回答。
var r = {};

exports.update = function(req, res) {
  r = res;
  var u = {
    $set: {}
  }
  for(var x in req.body){
    if (['name','stages'].indexOf(x)>=0)
    u.$set[x] = req.body[x];
  }
  Pipeline // this is a mongoose object
    .findOneAndUpdate({'_id.id':req.params.id},u,{new:true})
    .exec(respond);
}

function respond(err, data) {
  if (err) {
    return r.send(err);
  } else {
    return r.json(data);
  }
}
exports.update = function(req, res) {
  var u = {
    $set: {}
  }
  for(var x in req.body){
    if (['name','stages'].indexOf(x)>=0)
    u.$set[x] = req.body[x];
  }
  Pipeline // this is a mongoose object
    .findOneAndUpdate({'_id.id':req.params.id},u,{new:true})
    .exec(function(err, data) { respond(err, data, res) });
}

function respond(err, data, res) {
  if (err) {
    return res.send(err);
  }

  return res.json(data);

}