簡體   English   中英

只能發出一個沒有錯誤的 GET 請求:“發送后無法設置標頭。”

[英]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 ,通常你必須使用removeListenerunsubscribe

如果您使用once ,您實際上是在說您正在訂閱,但僅限於事件發生一次 - 然后您想自動取消訂閱。 這就是為什么它那么有效:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM