繁体   English   中英

Express 不允许来自同一 IP 的多个待处理请求?

[英]Express not allowing more than one pending request from the same IP?

我正在制作一个使用 express 的长轮询的聊天应用程序(我知道 websockets 对此更好,我只是想专门用长轮询来做一些事情)。

这是客户端在等待新聊天消息时向其发送GET请求的代码:

app.get('/api',(req,res)=>{
    listeners.push(res)
})

它将响应对象推送到一个数组,一旦有新的聊天消息可用,它就会在响应上调用.send() 客户端收到响应后,再次发送GET请求,等待新消息。

这是某人发送消息时的代码(简化)

app.post('/api', (req,res)=>{
    listeners.forEach(listener=>{
        listener.json(req.body)
    })
    listeners = []
    res.status(200).end()
})

我注意到,当我打开网站的两个选项卡时,首先只有第一个选项卡的请求被放入数组中。 这使得第二个选项卡不会收到第一条聊天消息。 第二个选项卡的请求仅在第一条聊天消息之后被推送到数组中。 因此,当发送第二条聊天消息时,它工作正常。 这意味着第二个选项卡总是落后一个请求。

如果不清楚,这是一个示例:

Client 1 connects
Client 2 connects
---
Client X sends a message:
Client 1's request 1 receives the message
Client 2's request 1 is still pending
---
Client X sends another message
Client 1's request 2 receives the message
Client 2's request 1 receives the message
---
Client X sends another message
Client 1's request 3 receives the message
Client 2's request 2 receives the message
...

我注意到的另一件事是,当我在客户端 1 和 2 连接后重新启动服务器时,客户端 2 的请求在重新启动后被推送到阵列中。

有人可以解释这种行为吗? 提前致谢。

这听起来像是浏览器希望使用缓存的请求,因此它会等待具有完全相同 URL 的先前请求,以查看它是否可以使用缓存的结果,而不是再次触发相同的请求。

您可以通过向每个请求添加一个唯一的查询参数来测试这个假设,因为这将禁用任何缓存尝试,因为它们都是不同的 URL。

或者,如果这些请求是使用浏览器中的fetch() api 发送的,您可以直接告诉该 API 不使用带有cache: 'no-cache'选项的缓存,如下所示:

const response = await fetch(url, {cache: 'no-cache'});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM