2015-09-26 41 views
0

由于我在客户端发生了错误,因此每次发送表单时,我的节点/快速API都会同时收到两次完全相同的PUT请求。获取客户端调用时的快速中断

在响应,服务器总是有以下错误而崩溃:

Error: Can't set headers after they are sent 

现在我固定的客户端,以便服务器不崩溃了,但我想正确地解决API。任何人都可以同时发送两个PUT请求来终止我的服务器。

所以我的问题:

  • 如何最好地快速处理“不能设置头”的错误?
  • 我的服务器代码中的错误是否允许首先发生该错误?

这里是我的服务器代码:

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

UPDATE:

错误来自我如何声明一个全局r为了有一个单一的响应回调以外的所有我的方法。

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

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

回答

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

} 
+0

谢谢,这实际上是有道理的,我更新了我的代码。尽管如此,执行官并没有犯错。 –

+0

我认为你需要在你的代码的其他地方看看。你可以尝试node-inspector来跟踪发生的事情 –

+0

谢谢,我发现了你不可能犯的错误,因为我没有逐字粘贴代码,我的错误。你能帮我绑定吗?我会接受你的回答。 –