Вы устанавливаете тайм-аут сокета , когда устанавливаете тайм-аут HTTP-сервера . Тайм-аут сокета предотвращает злоупотребления со стороны клиентов, которые могут захотеть повесить ваше соединение с вами DOS. У него есть и другие преимущества, такие как обеспечение определенного уровня обслуживания (хотя они часто более важны, когда вы являетесь клиентом).
Причина, по которой он использует тайм-аут сокета вместо отправки кода состояния 408
(Запрос Тайм-аут), потому что код состояния, возможно, уже был отправлен для успешного сообщения.
Если вы хотите реализовать тайм-аут ответа на своем бэкэнде и аккуратно обработать его, вы можете тайм-аут ответа самостоятельно. Обратите внимание, что вам, скорее всего, следует вместо этого ответить 408
. 502
для шлюзов, таких как прокси-серверы http (nginx), чтобы указать, что нисходящее соединение не удалось.
Вот простая реализация решения этой проблемы.
const httpServer = require('http').createServer((req, res) => {
setTimeout(()=>{
res.statusCode = 200;
res.statusMessage = "Ok";
res.end("Done"); // I'm never called because the timeout will be called instead;
}, 10000)
});
httpServer.on('request', (req, res) => {
setTimeout(()=>{
res.statusCode = 408;
res.statusMessage = 'Request Timeout';
res.end();
}, 1000)
});
httpServer.listen(8080);