Node.js:响应的管道流通过HTTPS冻结

时间:2011-11-24 13:04:25

标签: javascript node.js

我正在尝试使用Connect来提供静态内容,但是对于大文件(> 40KB),会发送第一个40,960字节的块(有时是32,940字节),然后传输会休眠2分钟然后转移结束。我发现当我将流传输到响应时会发生这种情况(这就是Connect发送响应的方式)。

以下是在Windows和Linux上的节点0.6.2上使用48,980字节文件重现此代码的代码:

var fs = require( "fs" ), https = require("https");

var privateKey = fs.readFileSync( 'privatekey.pem' ).toString();
var certificate = fs.readFileSync( 'certificate.pem' ).toString();
var options = {key: privateKey, cert: certificate};
var server = https.createServer( options,
function( req, res ) {
    var path = __dirname + "/public" + req.url;
    fs.stat(path, function(err, stat){
        if( err ) {
            res.writeHead(404, {'Content-Type': 'text/html'});
            res.end(""+err);
        } else {
            res.writeHead(200, {
                'Content-Type': 'text/html',
                'Content-Length': stat.size});
            var stream = fs.createReadStream(path);
            stream.pipe(res);
        }
    } );
} ).listen(8364);

使用fs.readFile,我无法重现:

var fs = require( "fs" ), https = require("https");

var privateKey = fs.readFileSync( 'privatekey.pem' ).toString();
var certificate = fs.readFileSync( 'certificate.pem' ).toString();
var options = {key: privateKey, cert: certificate};
var server = https.createServer( options,
function( req, res ) {
    fs.readFile(__dirname + "/public" + req.url, function(err, data){
        if( err ) {
            res.writeHead(404, {'Content-Type': 'text/html'});
            res.end(""+err);
        } else {
            res.writeHead(200, {
                'Content-Type': 'text/html',
                'Content-Length': data.length});
            res.end(data);
        } } );
} ).listen(8364);

我做错了吗?

2 个答案:

答案 0 :(得分:1)

就是这个问题:https://github.com/joyent/node/issues/2198

已在Node 0.6.4中修复!

答案 1 :(得分:0)

我的管道问题非常类似(可能是相关的) Valums file-uploader on nodejs - multiple file upload

也有2分钟的睡眠。没找到管道解决方案做了一些解决方法。