簡體   English   中英

為什么這個 node.js 代碼會阻塞?

[英]Why is this node.js code blocking?

我試着玩了一下 node.js 並編寫了以下代碼(這沒有意義,但這沒關系):

var http = require("http"),
    sys  = require("sys");

sys.puts("Starting...");

var gRes = null;
var cnt = 0;

var srv = http.createServer(function(req, res){
    res.writeHeader(200, {"Content-Type": "text/plain"});
    gRes = res;
    setTimeout(output,1000);
    cnt = 0;
}).listen(81);

function output(){
    gRes.write("Hello World!");
    cnt++;
    if(cnt < 10)
        setTimeout(output,1000);
    else
        gRes.end();
}

我知道其中有一些不好的東西(比如全局使用 gRes),但我的問題是,為什么這段代碼會阻止第二個請求,直到第一個請求完成?

如果我打開 url,它會開始寫“Hello World”10 次。 但是,如果我在第二個選項卡中同時打開它,一個選項卡會等待連接,直到另一個選項卡完成十次“Hello World”寫入。

我沒有發現任何可以解釋這種行為的東西。

肯定是您覆蓋了第一個請求正在使用的gRescnt變量嗎?

[實際上編輯,Chrome不會像Shadow Wizard所說的那樣一次發送兩個,但是由於每個新請求都會重置計數器,並且未完成的請求永遠不會關閉,因此代碼被嚴重破壞了]。

不要使用全局變量,而是將 output function 包裝為createServer回調中的閉包。 然后它將始終可以訪問本地res變量。

這段代碼對我有用:

var http = require("http"),
    sys  = require("sys");

sys.puts("Starting...");

var srv = http.createServer(function(req, res){
    res.writeHeader(200, {"Content-Type": "text/plain"});

    var cnt = 0;

    var output = function() {
        res.write("Hello World!\n");
        if (++cnt < 10) {
            setTimeout(output,1000);
        } else {
            res.end();
        }
    };

    output();

}).listen(81);

但是請注意,在連接關閉之前,瀏覽器不會呈現任何內容,因為告訴它在下載時顯示的相關標題不存在。 我使用telnet測試了上述內容。

我不熟悉node.js ,但通常熟悉服務器端語言 - 當瀏覽器向服務器發送請求時,服務器會為該請求創建一個 Session 以及來自同一瀏覽器的任何其他請求(在 Z21D6F40CFB5115082E457ZA 生命周期內處理)與 Session 相同。

可能是設計使然,並且有充分的理由,來自同一個 session 的請求是按順序處理的,一個接一個 - 只有在服務器完成處理一個請求后,它才會開始處理下一個請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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