获得concurent客户端调用时快速断开

时间:2015-09-26 16:13:47

标签: node.js http express

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

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

Error: Can't set headers after they are sent

现在我修复了客户端,因此服务器不再崩溃,但我想正确修复API。任何人都可以通过同时发送两个PUT请求来杀死我的服务器。

所以我的问题:

  • 如何使用Express?
  • 最好地处理“无法设置标题”错误
  • 我的服务器代码中首先出现错误的错误是什么?

这是我的服务器代码:

server.js

router.route('/deals/:id').put(deal.update);

deal.js

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

更新

错误来自于我如何声明全局r,以便在我的所有方法之外进行单个响应回调。

我通过对每个方法进行一次响应回调来修复它。

仍然有兴趣知道我是否可以使用绑定(res)来逃避?

1 个答案:

答案 0 :(得分:0)

您错过了返回,因此当出现错误时,您拨打了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);

}