【问题标题】:How to handle Node.js http server timeout event?如何处理 Node.js http 服务器超时事件?
【发布时间】:2021-05-04 12:23:18
【问题描述】:

我有一个 HTTP 服务器,它总是会导致 HTTP 超时,例如

const server = http.createServer((req, res) => {
  setTimeout(() => {
    res.writeHead(200);
    res.write('OK');
    res.end();
  }, 2000);
});
server.setTimeout(1000);
server.on('timeout', (socket) => {
  // How to produce a custom HTTP response here?
});

使用socket 引用发出HTTP 服务器“超时”事件。如何使用socket 对 HTTP 响应进行编码?

我知道我可以自己在低级别拼接响应,例如

server.on('timeout', (socket) => {
  socket.write([
    'HTTP/1.1 408 Request Timeout',
    'Connection: close'
  ].join('\n') + '\n\n');

  socket.end();
});

但是有没有办法使用HTTP响应接口,即writeHead/write/end

【问题讨论】:

    标签: node.js http


    【解决方案1】:

    您可以在响应对象上使用setTimeout 函数。考虑这个简单的例子:

    const http = require('http');
    const port = 3000;
    
    const requestHandler = (req, res) => {
        res.setTimeout(Math.random() * 2500, () => {
            res.writeHead(408);
            res.end();
        });
        setTimeout(() => {
            if (res.headersSent) {
                return;
            }
            res.writeHead(200);
            res.write('OK');
            res.end();
        }, 2000);
    };
    
    const server = http.createServer(requestHandler);
    
    server.listen(port, (err) => {
        if (err) {
            return console.log('an error happened', err)
        }
        console.log(`server is listening on ${port}`)
    });
    

    如果您在网络浏览器中调用 localhost:3000,您现在将看到 200 OK 或 408 错误。请注意,如果随机超时小于 2000 毫秒,您将需要处理已发送的标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2017-11-22
      • 2020-11-20
      相关资源
      最近更新 更多