Express / NodeJS Не удается отправить заголовки после их отправки, вызванные запросами http - PullRequest
3 голосов
/ 04 августа 2011

В первый раз работаю с NodeJS (да, это круто), а также с помощью Express.Получилось, что веб-приложение / служба работают отлично, но я сталкиваюсь с проблемами при попытке сделать более одного http-запроса.Вот видео о том, как приложение вызывает 2 http-запроса - http://screencast.com/t/yFKdIajs0XD - как вы видите, я нажимаю «статьи», оно загружает RSS-канал, затем нажимает видео и загружает YouTube-канал - оба работают просто отлично, но после второговызов сделан, это бросает исключение.Я получаю следующее, когда пытаюсь выполнить два отдельных запроса http с помощью модуля http узла:

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/rickblalock/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)

Пример кода, приведенного здесь: Использование модуля контроллера для визуализации запроса - http://pastie.org/2317698 Одна из вкладоквкладка статьи) - код видео идентичен минус ссылка на канал видео: http://pastie.org/2317731

1 Ответ

3 голосов
/ 04 августа 2011

попробуйте использовать событие "конец", а не "данные", как это:

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
        });
    }
});

старый ответ

я тоже думаю, что это виновник:

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

первая строка асинхронна, поэтому все, что находится внутри обратного вызова, вызывается после выполнения req.write() и req.end() поместите эти две строки в обратный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...