nodejs req.on('end', callback) не работает свойство

В настоящее время я использую nodejs для создания прокси-серверов, которые используют следующий синтаксис для отправки и получения https-запроса и ответа. Однако в моем проекте ответ немного больше, поэтому обычно req.on('data', callback) будет вызываться 5-7 раз перед вызовом req.on('end', callback).

Вот упрощенная структура кода:

var http = require("https");
var options = {
    hostname: '<WEB SERVICE>',
    port: 80,
    path: '<WEB PATH>',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    }
};
var response = "";
var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (body) {
        console.log("data");
        response += body;
    });

    res.on('end', function () { 
        console.log("end");
        response = "";
    });
});
req.on('error', function(e) {
     console.log('problem with request: ' + e.message);
});
// write data to request body
req.write('<SOMETHING>');
req.end();

В идеале, когда приходит несколько запросов, последовательность регистрации должна быть:

data, data, data, data, data, end, data, data, data, data, end

т.е. как только один запрос сделан, end будет вызван один раз.

Однако после нескольких тестов отклик большой. Последовательность становится:

<response 1 comes>data, data, data ..... data <response 2 comes> data, data,       data, ..., data, end

то есть конец запроса 1 отсутствует.

Короче говоря, нам нужно убедиться, что обратный вызов 'end' вызывается ровно один раз сразу после нескольких обратных вызовов req.on('data', callback).

Я считаю, что должен быть какой-то общий метод для решения этих проблем (кажется, классические ошибки в узле), и будет признателен, если кто-нибудь может указать, как решить эту проблему.

Спасибо за помощь!

2 ответа

Из кода, который вы включили, невозможно сделать два запроса. Это делает один запрос с этим:

var req = http.request(options, function(res) { ... });

Затем связывает обработчик ошибок здесь:

req.on('error', function(e) { ... });

И затем непосредственно перед тем, как даже дождаться ответа на запрос, прежде чем будет установлено соединение, он вызывает .write() а также .end() методы объекта запроса:

req.write('<SOMETHING>');
req.end();

Ничто здесь не может вызвать двух запросов одновременно. Но даже если первый (и единственный) запрос еще не начался, вы уже звоните .write() а также .end() методы, так что, возможно, есть ваша проблема.

В дополнение к этому вы должны ожидать, что один запрос будет запущен до того, как другой завершится, если вы собираетесь выполнять несколько запросов параллельно, как вы говорите, что хотели бы.

у меня была такая же проблема раньше, я исправил вот так:

      res.on('finish', function () { 
    console.log("res finished");
});

Посмотрите здесь nodejs.org event-finish

Другие вопросы по тегам