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

6

我正在尝试使用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处被截断。这种情况只会在HTTPS协议下出现,并且只会在网络环境中发生(例如:不会在本地主机上发生)。非常感谢您的帮助。
5个回答

13

你应该使用Content-Length: Buffer.byteLength(data, 'utf8')替代Content-Length: data.length,其中Buffer是全局对象(node 0.3.x)或在node 0.2.x中使用var Buffer = require('buffer'),这将为你节省很多麻烦,并可能解决截断答案的问题。


应该把这个标记为正确答案。实际上,正确的是:Buffer.byteLength(data, 'utf8')。请注意,“語語語”的长度为3,而Buffer.byteLength("語語語", 'utf8')的值为9,在这种情况下,这才是正确答案。 - Phil Kulak
谢谢Phil,看到那个了! - tedeh

1

我刚刚也看到了这个。相同的设置 - HTTPS,来自git repo的最新节点。

一个大文件(170k),始终没有正确地完成发送。我尝试从异步切换到同步,但没有任何区别。迄今唯一修复它的事情是使文件更小。这是一个大容量的jpg文件,所以很容易做到。问题消失了。


0

0

这个问题应该在最新版本的Node.js中得到解决。你能否在v0.4.2上进行测试?


0

这可能是readFile和res.end()默认编码之间的断开连接。如果您没有指定编码,readFile只会加载原始数据,而end()默认为utf8。我不是100%确定,但文件中的原始数据可能返回比end发出的utf8编码字符串更短的长度。

我尝试重新创建您的错误并失败了,因此您可能需要升级您的node版本。我正在使用github上的最新代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接