2013-04-09 48 views
6

我有這樣一段代碼:請求在node.js中沒有結束(用於工作)

var app = require('http').createServer(function(req, res){ 
    console.log(req); 
    req.addListener('end', function() { 
     fileServer.serve(req, res); 

    }); 
}); 

var statics = require('node-static'); 
var fileServer = new statics.Server('./'); 

app.listen(1344, '127.0.0.1'); 

app.on('error', function(err){ 
    console.log(err); 
}) 

它工作得很好,直到我做了一些改動,節點給出了一個錯誤,當我回去了,那個錯誤已經不存在了,但並沒有像在這個事件沒有被解僱之前那樣工作。所以,req.addListener('end', function(){});內的任何內容都不會被調用。

即使我運行另一個使用相同事件的node.js也不會被觸發。這就好像請求的結束事件被破壞了一樣。但這怎麼可能呢?

這不是第一次發生。上次我結束重新安裝節點(在嘗試了很多不同的事情之後)。我寧願找到一個解決方案,所以我可以理解這個問題!

注意:原始代碼包括socket.io和其他類型的連接,但是我剛粘貼了應用程序被卡住的代碼段。

知道如何調試問題也很有用!

+0

嘗試用'節點v0.8.x'或http://nodejs.org – InspiredJW 2013-04-09 04:08:01

+0

我不能fileServer.serve'是否'作品講讀流2 Documenation,但如果你拿出所有與'node-static'有關的東西,你的代碼按原樣工作,'end'事件肯定會被調用。我記得我們嘗試使用'node-static'時遇到了問題,如果這確實是您的問題,那麼使用Connect中的靜態中間件可能會更好。 http://www.senchalabs.org/connect/static.html – 2013-04-09 04:28:04

+0

@InspiredJW我在v0.10.3上。你是說我應該降級? – limoragni 2013-04-09 05:40:50

回答

13

@InspiredJW應該因爲我已經忘記了這一點而得到好評,但無疑你的問題是因爲可讀流的變化。爲了讓end事件被調用,您必須將偵聽器附加到data事件,或者您必須致電stream.resume()

require('http').createServer(function(req, res){ 
    req.addListener('end', function() { 
     // won't ever get called in node v0.10.3 
    }); 
}); 

require('http').createServer(function(req, res){ 
    req.addListener('end', function() { 
     // will get called in node v0.10.3 because we called req.resume() 
    }); 
    req.resume(); 
}); 

require('http').createServer(function(req, res){ 
    req.on('data', function (chunk) { }); 

    req.addListener('end', function() { 
     // also will get called because we attached a data event listener 
    }); 
}); 

http://nodejs.org/api/stream.html#stream_compatibility

+0

太好了。現在正在工作。我無法理解的是,如何在第一個地方工作!我是node.js的新手,我必須閱讀很多才能使其工作。你知道一本關於節點的好書嗎?我知道Apress正在開發一款,但我希望立即擁有一款。謝謝! – limoragni 2013-04-09 17:58:17

+0

我不會,對不起。我剛剛通過使用它學習了節點。它可能以前工作過,因爲你有一個「data」事件監聽器,或者你使用的是舊版本的節點。 – 2013-04-09 18:04:28

+0

@limoragni您可能已將節點升級到v0.10.3或更高版本,這就是導致它停止工作的原因。 – Chev 2013-09-17 00:24:46