开发者

Express / NodeJS Can't send headers after they are sent caused by http requests

开发者 https://www.devze.com 2023-03-25 08:23 出处:网络
First time working with NodeJS (yes, it\'s awesome) and also using Express as well.Got the web app / service working great but I run in to problems when trying to make more than one http request.Here\

First time working with NodeJS (yes, it's awesome) and also using Express as well. Got the web app / service working great but I run in to problems when trying to make more than one http request. Here's a video of how the app causes 2 http requests - http://screencast.com/t/yFKdIajs0XD - as you can see I click on 'articles' it loads an rss feed, then click videos and it loads a youtube feed - both work just fine but after the second call is made it throws an exception. I get the following when I attempt two separate http requests using node's http module:

http.js:527
throw new Error("Can't set headers after they are sent.");
      ^

Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/Users/rickblalo开发者_JS百科ck/node/auti_node/node_modules/express/node_modules/connect/lib/patch.js:47:22)
at /Users/rickblalock/node/auti_node/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js:72:19
at [object Object].<anonymous> (fs.js:107:5)
at [object Object].emit (events.js:61:17)
at afterRead (fs.js:878:12)
at wrapper (fs.js:245:17)

Sample code provided here: Using my controller module to render the request - http://pastie.org/2317698 One of the tabs (article tab) - the video code is identical minus referencing a video feed: http://pastie.org/2317731


try using the "end" event not "data" like this:

var data = "";

app.get('/', function(req, res){

    var options = {
          host: 'http://www.engadget.com',
          path: '/rss.xml',
          method: 'GET'
        };

    if (data === "") {
        var myReq = http.request(options, function(myRes) {
            myRes.setEncoding('utf8');

            myRes.on('data', function(chunk) {
                console.log("request on data ");
                data += chunk;
            });

            myRes.on('end', function () {
                console.log("request on END");
                res.render('index', {
                    title: 'Express',
                    data: data
                });
            });
        });

        myReq.write('data\n');
        myReq.end();
    }
    else {
        res.render('index', {
            title: 'Express',
            data: data
        });
    }
});

old answer

i also think that this is the culprit:

var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function(chunk) {
      parseArticle(chunk);
    });
});
req.write('data\n');
req.end();

the first line is async so everything inside the callback is called after you do req.write() and req.end() put these two lines into the callback.

0

精彩评论

暂无评论...
验证码 换一张
取 消