Как установить таймаут для клиентских 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.socket.setTimeout(60000); // 60 сек

Я думаю, что вы можете сделать что-то вроде:

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

Смотрите этот ответ.

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