2010-10-11 17 views
6

我想用Node.js來服務一些JavaScript文件,並且無論出於什麼原因文件在傳輸過程中被切斷。代碼:Node.js在通過HTTPS服務時切斷文件

httpsServer = http.createServer(function(req, res) { 
    var path = url.parse(req.url).pathname; 

    if (path[path.length - 1] == '/') { 
      path += 'index.html'; 
    } 

    fs.readFile(root + path, function(err, data){ 
      if (err) return send404(res); 

      res.writeHead(200, { 
       'Content-Type': getMimeType(getExtension(path)), 
       'Content-Length': data.length}); 
      res.end(data); 

    }); 
}), 

var privateKey = fs.readFileSync(settings.PRIVATE_KEY).toString(); 
var certificate = fs.readFileSync(settings.CERTIFICATE).toString(); 

var credentials = crypto.createCredentials({key: privateKey, cert: certificate}); 
httpsServer.setSecure(credentials); 
httpsServer.listen(settings.HTTPS_PORT); 

的文件http://github.com/LearnBoost/Socket.IO/raw/master/socket.io.jshttp://code.jquery.com/jquery-1.4.2.min.js。第一個正好是32KB,第二個正好是16KB。這不會發生在HTTP上,只發生在HTTPS上,並且只發生在網絡上(例如:不是從本地主機發出)。

任何幫助將非常感激。

回答

12

而不是Content-Length: data.length你應該使用Content-Length: Buffer.byteLength(data, 'utf8')其中Buffer是節點的0.2.x一個全局對象(節點0.3.X)或var Buffer = require('buffer')這將節省你很多的麻煩,並可能修復被截斷的回答你的問題了。

+0

這應該被標記爲正確的答案。那麼,這實際上是:Buffer.byteLength(data,'utf8')。請注意,「語語語」.length == 3,而Buffer.byteLength(「語語語」,'utf8')== 9,這種情況下的正確答案。 – 2011-04-11 16:55:42

+0

謝謝菲爾,監督一個! – tedeh 2011-04-12 11:14:28

0

它可能是readFile和res.end()的默認編碼之間的斷開。如果不指定編碼,readFile只加載原始數據,而end()默認爲utf8。我不是100%確定的,但文件中的原始數據可能會返回比最終發出的utf8編碼字符串更短的長度。

我試着重新創建錯誤並失敗,因此可能需要升級您的節點版本。我正在使用來自github的最新代碼。

1

我剛剛也見過這個。相同的設置 - HTTPS,git倉庫中的最新節點。

一個大文件(170k)從未正確完成發送。我試圖從異步切換到同步,但沒有任何區別。到目前爲止,修正它的只是使文件變小。這是一張大大的軟盤jpg,所以很容易做到。問題消失了。

0

這個問題應該在最新版本的Node.js中解決。你可以在v0.4.2上測試嗎?