[英]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”寫入。
我沒有發現任何可以解釋這種行為的東西。
肯定是您覆蓋了第一個請求正在使用的gRes
和cnt
變量嗎?
[實際上編輯,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.