Node.js在通过HTTPS提供服务时会切断文件

时间:2010-10-11 10:45:27

标签: node.js

我正在尝试使用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.jshttp://code.jquery.com/jquery-1.4.2.min.js。第一个是正确的32KB,第二个正好是16KB。这不是通过HTTP发生的,只发生在HTTPS上,而且只发生在网络上(例如:不是来自localhost)。

任何帮助都会非常感激。

5 个答案:

答案 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