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