当前位置: 首页 > 知识库问答 >
问题:

表示js连接超时vs服务器超时

钮轩昂
2023-03-14

我使用快速和连接超时中间件来处理超时。

它工作得很好,但是我默认的节点超文本传输协议服务器的超时设置为两分钟。

因此,如果我想将超时中间件设置为大于两分钟的值,我还必须将http服务器超时增加到稍大一点(否则我的连接超时处理程序不会被调用)

const app = express();
const http = new Http.Server(app);

http.setTimeout((4 * 60 * 1000) + 1); <-- Must set this

app.use(timeout('4m')); 

我怎样才能避免这种情况?我错过什么了吗?

共有1个答案

乐正乐湛
2023-03-14

如果要使用连接超时中间件,则无法避免,因为中间件不会更改套接字超时,默认为2分钟。

有两种可能的方法可以避免它,要么使用server.setTimeout()request.setTimeout

如果您只想将超时更改为几个路由,而将默认超时保留为其余路由,建议使用:request。设置超时

app.use('/some-routes', (req, res, next) => {
   req.setTimeout((4 * 60 * 1000) + 1);
   next();
}, timeout('4m'));

设置req的替代方法。将超时设置为大于连接超时值的值,会删除连接超时中间件并使用另一种解决方法,这也是不理想的。

您可以检查这个旧节点。js问题https://github.com/nodejs/node-v0.x-archive/issues/3460

function haltOnTimedout (req, res, next) {
  if (!req.timedout) next()
}

app.use('/some-routes', (req, res, next) => {
    req.setTimeout(4 * 60 * 1000); // No need to offset

    req.socket.removeAllListeners('timeout'); // This is the work around
    req.socket.once('timeout', () => {
        req.timedout = true;
        res.status(504).send('Timeout');
    });

    next();
});


app.use(haltOnTimedout);

// But if the timeout occurs in the middle of a route
// You will need to check if the headers were sent or if the request timedout

app.get('/some-routes', async(req, res, next) => {
  
  // some async processing...
  await asyncOperation();
  
  if (!res.headersSent) // or !req.timedout 
    res.send('done');
 
});

 类似资料:
  • 在我的文件中,我有... 我知道文件正在正确加载,因为服务器在端口8086上运行。 在应用程序中,我有一个 当我调用endpoint时,请求永远不会超时,它只是无限期地挂起。 我错过了什么吗? 注意:我还被告知,Tomcat使用这个字段是以分钟为单位,而不是以毫秒为单位(这在我看来是相当不寻常的选择)。我试着将它设置为< code > server . connection-time out =

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接

  • 问题 我一直在寻找Express的请求/响应超时。但是一切似乎都与连接有关,而不是请求/响应本身。 如果请求需要很长时间,则应超时。显然,这不应该发生,但即使是一个简单的错误,比如没有回调调用的路由处理程序或没有res.send(),浏览器也会永远等待回复。 空路由处理程序就是一个很好的例子。 修复 我在似乎添加了超时功能。有人对此有任何经验/意见吗? 注意,我已将超时设置为2分钟。

  • **dataframe2:从另一个来源获得的键的Dataframe(这些键是上表中ID列的分区键)-此表中不同键的数量约为0.15万** 现在,此代码总是导致“com.datastax.oss.driver.api.core.servererrors.ReadFailureException:在一致性LOCAL_ONE读取查询期间Cassandra失败(需要1个响应,但只有0个副本响应,1个失败)

  • 问题内容: 有什么不同?我什么时候应该使用哪个?我是Angular的新手,他们看上去和我非常相似。我宁愿从一开始就遵循最佳实践。 问题答案: 重复执行回调,而只是延迟执行回调(不重复)。所以,不,他们不一样。另外,应该注意的是,它们两者都是和的包装。 我还建议阅读由John Resig撰写的有关Javascript计时器如何工作的精彩文章。

  • 所以我有我的 Amazon RDS 实例,我允许我的 EC2 组让所有内容都连接,并且可以在脚本从我自己的机器运行时(使用 XAMPP 安装)完全建立 PDO 连接。 然而,当我从服务器上运行时,我得到一个 错误 从我自己的机器上运行脚本时不会出现此错误,我可以在那里很好地连接到数据库,进行插入和选择等。但是一旦我在我的实际EC2服务器上,blip总是无法连接。此外,它无法连接到任何MySQL实例