2012-10-15 24 views
0

難道有人請向我解釋下列行爲的原因嗎?節點js express:無效的請求數據?

我有一個的NodeJS /快遞網絡服務器和假設包含以下代碼的郵路的一個:

req.on('data', function() { console.log('data arrived'); }) 

此代碼按預期工作,並寫入「數據到達」消息調用時安慰。下面的代碼然而:

setTimeout(function() { req.on('data', function() { console.log('data arrived'); }) }, 1000); 

儘管有相同的情況下不會打印任何東西。如果我們在短時間內訂閱他們的事件,請求對象流會發生什麼?

我需要這個的原因是我想上傳大文件到我的服務器。當一個post請求到達時,我需要創建一個數據庫條目並將數據傳遞給它。由於可能的大小,我無法將數據塊存儲在內存中,但我無法從數據庫回調或任何回調獲取請求對象的數據。

你有一個想法如何解決這個問題? 在此先感謝!

UPDATE

下面的代碼仍然不能正常工作:

req.pause(); 
setTimeout(function() { 
    req.on('data', function(data) { console.log('data arrived'); }) 
    req.resume(); 
}, 1000); 

UPDATE2

的最終目標是做SG是這樣的:

req.pause(); 
doSometingAsync(function(result) { 
    req.on('data', function(data) { doSomethingWithData(data, result) }); 
    req.resume(); 
}); 

,但這似乎不起作用...

UPDATE 3

這將導致一個「過去」沒有別的:

req.pause() 
setTimeout() -> 
    console.log 'elapsed' 
    req.on 'error', (error) -> console.log error 
    req.on 'data', (data) -> console.log 'in data' 
    req.on 'end',() -> console.log 'end' 
    req.resume() 
, 2000 

回答

1

答:

你可以解僱req.pause();當數據到達,處理像它寫入一個文件中的數據當文件寫入回調觸發時,您可以執行req.resume();以接收下一個包。

你不應該做的是重新定義了「數據」事件,除非您使用req.once,而不是req.on

這將帶寬限制到你的身體的硬盤速度,將讓您的應用程序asyncronous並會降低內存佔用。

更新1個回答:

這這裏是一些僞代碼:

req.on("data", function (data) { 
    req.pause(); 
    /* do something with data like the following: */ 
    some_method(some_value, data, function (success) { 
     if (success) { 
      req.resume(); 
     } 
    }); 
}); 

或者是這樣的:

req.on("data", function (data) { 
    req.pause(); 
    console.log("data arrived"); 
    setTimeout(function(){req.resume();}, 1000); 
}); 

更新2回答: 你應該使用一個回調

在這種情況下,第三個參數doSomethingWithData();在此功能完成後立即啓動req.resume();

除此之外,您還應該調用回調像這樣留異步:

var doSomethingAsync = function (data, result, cb) { 
    /* do something with data and result */ 
    process.nextTick(function() { 
     cb(); 
    }); 
}; 

req.pause(); 
doSomethingAsync(function (result) { 
    req.on('data', function (data) { 
     req.pause(); 
     doSomethingWithData(data, result, function() { 
      req.resume(); 
     }); 
    }); 
    req.resume(); 
}); 

或你這樣做:

當然
var doSomethingAsync = function (data, result, req) { 
    /* do something with data and result */ 
    process.nextTick(function() { 
     req.resume(); 
    }); 
}; 

req.pause(); 
doSomethingAsync(function (result) { 
    req.on('data', function (data) { 
     req.pause(); 
     doSomethingWithData(data, result, req); 
    }); 
    req.resume(); 
}); 
+0

doSomethingAsync有一個正確調用回調方法。回調觸發正常。主要的問題是req.on回調中的代碼從不執行。 – kataik

+0

有一個req.resume()失蹤..我可以殺死自己監督這個..只是嘗試我的最後一個代碼片段之一。 – GottZ

+0

不幸的是,仍然無法正常工作,請查看我的最後一個例子,儘可能簡化以顯示問題 – kataik