[英]How to send response asynchronously in nodejs / express
const express = require("express");
const router = express.Router();
router.get("/", async (req, res, next) => {
setTimeout(() => {
res.send("Hello Stackoverflow");
}, 10000);
});
module.exports = router;
當我同時從兩個瀏覽器選項卡發送獲取請求時,第一個請求在 10 秒內完成,第二個請求需要 20 秒。
我希望這兩個請求都能在 10 秒內完成,因為我使用 setTimeout 使其異步。 我在這里做錯了什么還是nodejs在完成第一個請求之前沒有接受另一個請求?
我想要這段代碼做的是:
請求──> setTimeout
請求──> setTimeout
setTimeout 完成 ──> 發送響應
setTimeout 完成 ──> 發送響應
它目前正在做的是:
請求──> setTimeout
setTimeout 完成 ──> 發送響應
請求──> setTimeout
setTimeout 完成 ──> 發送響應
我怎樣才能做到這一點?
編輯 =>
我懷疑這是一些僅限 chrome 的行為,因為代碼在 firefox 中有效。 此外,如果我打開一個普通選項卡和另一個隱身選項卡,它會按預期工作。
這是由於您的瀏覽器想要為多個請求重用與 Express 服務器的連接,因為默認情況下,Express(實際上,Node.js 的http
服務器會這樣做)通過設置 header Connection: keep-alive
(見下文了解更多信息)。
為了能夠重用連接,它必須等待請求完成,然后才能通過同一連接發送另一個請求。
在您的情況下,第一個請求需要 10 秒,然后才發送第二個請求。
為了說明這種行為,試試這個:
router.get("/", async (req, res, next) => {
res.set('connection', 'close');
setTimeout(() => {
res.send("Hello Stackoverflow");
}, 10000);
});
這告訴瀏覽器應該在每次請求后關閉連接,這意味着它將為第二個請求創建一個新連接,而不是等待第一個請求完成。
有關更多信息,請查看此處: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.