只能发出一个GET请求,而不会出现错误:“发送后无法设置标题”。

我想我的http服务器返回从asynchronous函数返回的一些json。 我设法使它工作,但它只能工作一次,然后抛出:“发送后无法设置标题。 错误。

这里是下面的代码:

var server = restify.createServer(); server.get('/', function(req, res, next) { feed("dilma",[]); eventEmitter.on('retorno', function(retorno){ res.send(retorno); }); }); server.on("listening", function() { console.log("server running!"); }); server.listen(7171); 

进给function:

 var feed = function headLinesBySite(word, l) { if (!Array.isArray(l)) { console.log("por favor passe um array"); return false; } if (l !== []) { links = l; } links = ["http://www.estadao.com.br/", "http://atarde.uol.com.br/"]; var teste = 0; var final = []; for (i = links.length - 1; i >= 0; i--) { findHeadlines(links[i], word.toLowerCase(), function(r, url) { final.push({ url: url, manchetes: r }); //console.log(url+" - "+r); teste++; console.log((teste / links.length) * 100 + "%"); if (teste === links.length) { console.log("Concluído!"); console.log(final); eventEmitter.emit('retorno', final); } }); } }; 

findHeadlines函数:

 var findHeadlines = function findHeadlines(url, word, cb) { request(url, { timeout: 1000 }, function(error, response, body) { if (!error && response.statusCode == 200) { $ = cheerio.load(body); texto = []; var retorno = []; b = $('body').text().toLowerCase(); c = b.replace(/\s+/g, ' '); texto = c.split("¬"); for (var i = texto.length - 1; i >= 0; i--) { if (texto[i].search(word) !== -1 && texto[i].length < 100) { //console.log(texto[i]); retorno.push("+" + texto[i] + "+"); } } cb(retorno, url); } else { console.log(error); cb([], url); } }); }; 

第一次我打电话给localhost / 7171我得到的信息,但之后,任何GET请求抛出:“发送后无法设置标题”。 我已经阅读了一些类似的问题关于这个相同的错误,但没有一个帮助我解决它…我只是想让GET请求等待喂饲function的asynchronous返回…欣赏任何帮助。

 eventEmitter.on('retorno', function(retorno){ res.send(retorno); }); 

你正在订阅retorno事件,但你永远不会退订。 因此,如果事件再次发生,那么旧的路由处理程序再次运行res.send – 但是现在在一个已经closures的连接上。

改变once ,问题可能会消失。 欲了解更多细节,你必须仔细看看你的整个代码。

希望这可以帮助。

订阅和取消订阅意味着订阅就像是说“从现在开始,我想在事件X发生时得到通知”。 直到你说你不再感兴趣(即你退订)为止。 on等同于subscribe ,通常你必须使用removeListenerunsubscribe

如果您只使用once ,则表示您正在订阅,但是直到事件发生一次 – 然后您想要自动取消订阅。 这就是为什么它的工作原理:-)