Как установить таймаут для клиентских http-соединений в node.js
Я пишу приложение node.js, которое должно общаться с сервером. Он устанавливает http-соединение со следующим кодом:
var client = http.createClient(u.port, u.hostname, u.secure);
client.on("error", function(exception) {
logger.error("error from client");
});
var request = client.request(method, u.path, headers);
Я не вижу никакой опции в документации node.js для установки тайм-аута соединения, и он, по-видимому, по умолчанию установлен на 20 секунд. Проблема, с которой я столкнулся, заключается в том, что у меня есть пользователи в Китае, работающие в медленной или нестабильной сети, которые иногда превышают время ожидания подключения к нашему центру обработки данных в США. Я хотел бы увеличить время ожидания до 1 минуты, чтобы посмотреть, исправит ли это их.
Есть ли способ сделать это в node.js?
4 ответа
Я думаю, что вы можете сделать что-то вроде:
request.connection.setTimeout(60000)
request.connection возвращает объект net.Stream, связанный с соединением. и net.Stream имеет метод setTimeout.
В Node нет возможности увеличить время ожидания соединения. Поскольку обычно время ожидания соединения (т. Е. Время установления соединения) является общесистемной настройкой для всех приложений (например, 21 секунда в Windows, от 20 до 120 секунд в Linux). Смотрите также Timouts в пакете запроса.
Напротив, Node позволяет установить уменьшенное время ожидания и прервать соединение, даже если соединение еще не установлено.
Дальнейшие таймауты (в случае установления соединения) можно контролировать в соответствии с документацией (см. request.setTimeout
, socket.setTimeout
).
Прежде чем устанавливать таймаут, вы должны подождать, пока соединение с клиентским сокетом будет установлено. Чтобы сделать это, добавьте обратный вызов для события 'socket':
req.on('socket', function (socket) {
myTimeout = 500; // millis
socket.setTimeout(myTimeout);
socket.on('timeout', function() {
console.log("Timeout, aborting request")
req.abort();
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
// error callback will receive a "socket hang up" on timeout
});