2013-05-13 42 views
0

我正在使用restify模块启动节点js Web服务器。nodejs restify错误 - 处理为静态函数的回调服务请求

server = restify.createServer(); 
server.post('/getData', DataManager.getData); 

处理器为/getData路径是这样的: -

DataManager.prototype.getData = function(request, response, next) { 
    var body = JSON.parse(request.body); 
    var key = body.key; 

    callback = function(err, instance) { 
     if(!err && instance) { 
      response.send(instance); 
     } 
     else { 
      response.send('err'); 
     } 
     return next(); 
    } 

    MongooseModel.findOne(key, callback); 
} 

当我拍不同的有效载荷2个并发请求/getData,服务器抛出[Error: Can't set headers after they are sent.]错误,并且不会给第二请求作出响应。

我正在寻找补救办法。

-

我认为,对待的RESTify作为DataManager.getData一个静态函数。它使用一个新的对象DataManager来向/getData提供每个请求,而不是使用它的单个静态实例。虽然第一个请求仍然按nodejs执行,但第二个请求尝试发送响应,这就是为什么nodejs说can't set headers after they are sent。我得出这个结论,因为我试着拍摄两个连续的请求,而不是平行的请求,我的代码在这种情况下工作得很好。

回答

2

您的回调有上下文问题!

应指定响应&未来的会议......你试图用var宣布,它可能会解决你的问题,我想......

var callback=..... 

在其他情况下,你需要通过这两个响应()& next()它...

+0

声明与VAR帮助回调。你能否详细说明为什么这会起作用?有和没有var的回调有什么区别?我是一个JavaScript初学者。 – haltTm 2013-05-14 10:31:19

+0

没有var你的功能是“全球化”,老实说,我不知道什么是“关闭”(我认为所有的调用回调采取最后的功能,但不知道) – 2013-05-14 11:02:18

+0

随着var你创建一个本地实例或你的函数为每getdata调用,你肯定会关闭它.....希望它更清晰,像这样:) – 2013-05-14 11:04:56

相关问题