오류없이 하나의 GET 요청 만 만들 수 있습니다. "전송 된 후에는 헤더를 설정할 수 없습니다."

Caio Fontes

내 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관