开发者

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

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

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜