我正在尝试使用Node.js提供一些JavaScript文件,无论出于何种原因,文件在传输过程中被切断。代码:
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.js和http://code.jquery.com/jquery-1.4.2.min.js。第一个是正确的32KB,第二个正好是16KB。这不是通过HTTP发生的,只发生在HTTPS上,而且只发生在网络上(例如:不是来自localhost)。
任何帮助都会非常感激。
答案 0 :(得分:12)
您应该使用Content-Length: data.length
而不是Content-Length: Buffer.byteLength(data, 'utf8')
,其中Buffer
是全局对象(节点0.3.x)或节点0.2.x中的var Buffer = require('buffer')
,这将为您节省很多麻烦,也可能用截断的答案解决你的问题。
答案 1 :(得分:1)
我也刚看过这个。相同的设置 - HTTPS,来自git repo的最新节点。
一个大文件(170k)从未正确完成发送。我试图从异步切换到同步但它没有任何区别。到目前为止,只有修复它的东西才使文件更小。这是一个很大的软盘jpg因此很容易做到。问题消失了。
答案 2 :(得分:0)
它可能是readFile和res.end()的默认编码之间的断开连接。如果没有指定编码,readFile只加载原始数据,而end()默认为utf8。我不是100%肯定,但文件中的原始数据返回的长度可能比最终发出的utf8编码字符串的长度短。
我尝试重新创建错误并失败,因此可能需要升级您的节点版本。我正在使用github的最新代码。
答案 3 :(得分:0)
这个问题应该在最新版本的Node.js中解决。你能在v0.4.2上测试吗?
答案 4 :(得分:0)
您是否尝试使用内置HTTPS服务器? http://nodejs.org/docs/v0.4.11/api/https.html