簡體   English   中英

如何在nodejs / express中異步發送響應

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM