내 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
실제로 구독 중이 라는 의미이지만 이벤트가 한 번만 발생할 때까지만 자동으로 구독을 취소하고 싶습니다. 그것이 그때 작동하는 이유입니다 :-)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다