[英]Can only make one GET request without error: "Can't set headers after they are sent."
我希望我的 http 服務器返回一些從異步函數返回的 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);
進料功能:
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 請求等待提要函數的異步返回......感謝任何幫助。
和
eventEmitter.on('retorno', function(retorno){
res.send(retorno);
});
你訂閱了retorno
事件,但你永遠不會取消訂閱。 因此,如果第二次引發事件,舊的路由處理程序會再次運行res.send
- 但現在在一個已經關閉的連接上。
變化on
,以once
,問題可能會消失。 有關更多詳細信息,您必須仔細查看您的整個代碼。
希望這可以幫助。
訂閱和取消訂閱我的意思是訂閱就像說“從現在開始,我想在事件 X 發生時得到通知”。 這是有效的,直到您說您不再感興趣(即,您取消訂閱)。 on
相當於subscribe
,通常你必須使用removeListener
來unsubscribe
。
如果您使用once
,您實際上是在說您正在訂閱,但僅限於事件發生一次 - 然后您想自動取消訂閱。 這就是為什么它那么有效:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.