簡體   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