2016-05-21 71 views
0

我正在开发一个网络应用程序,其中有一个数据库用于游戏数据,当您点击任何游戏时,我向API发出GET请求。我希望我的应用程序能够工作,以便您可以点击任何一款游戏,并且您可以使用请求中的额外信息填充该游戏的页面,而无需为每个游戏提前发送GET请求(约200张) ,但我有以下问题:NodeJS:有多个GET请求的错误

_http_outgoing.js:344 
    throw new Error('Can\'t set headers after they are sent.'); 
    ^

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
    at ServerResponse.header (C:prototype\node_modules\express\lib\response.js:718:10) 
    at ServerResponse.send (C:prototype\node_modules\express\lib\response.js:163:12) 
    at ServerResponse.json (C:prototype\node_modules\express\lib\response.js:249:15) 
    at EventEmitter.<anonymous> (C: prototype\webapp.js:182:14) 
    at emitNone (events.js:72:20) 
    at EventEmitter.emit (events.js:166:7) 
    at IncomingMessage.<anonymous> (C:webapp.js:237:17) 
    at emitNone (events.js:72:20) 
    at IncomingMessage.emit (events.js:166:7) 
    at endReadableNT (_stream_readable.js:913:12) 
    at nextTickCallbackWith2Args (node.js:442:9) 
    at process._tickCallback (node.js:356:17) 

这里是我试图运行代码:

req = https.request(options, function(res) { 
    var responseBody =""; 
    res.setEncoding("UTF-8"); 
    //retrieve the data in chunks 
    res.on("data", function(chunk) { 
     responseBody += chunk; 
    }); 

    res.on("end", function(){ 
     //Once completed we parse the data in JSON format 
     sendData = JSON.parse(responseBody); 
     console.log(sendData); 
     eventEmitter.emit('got_data'); 
    }); 
}); 

req.on("error", function(err) { 
    console.log(`problem with request: ${err.message}`); 
}); 
req.end(); 

这里是它的路由:

app.get('/api/gameDetails', function(req, res) {  
    var device = req.query.device; 
    var id = req.query.id; 
    requestForGameDetails(id, device); 
    eventEmitter.on('got_data', function() { 
     return res.json(sendData); 
    }); 
}); 
+0

我环顾四周,我知道这个问题是在'返回res.json(sendData);'因为它被调用两次,但我想修复它,以便它不再是一个问题。 – KC32

+0

尝试使用eventEmitter.once而不是eventEmitter.on在您的获取路线代码 – vbranden

+0

谢谢你的工作! :)你可以正式提交它作为回应,所以我可以接受它作为一种解决方案? – KC32

回答

1

你是g设置错误,因为您使用eventEmitter.on不断监听事件,并多次发送结果。由于您只能发送一个响应,因此您需要使用eventEmitter.once这将在第一个事件后删除侦听器。