Node.js:如何将流读入缓冲区?

117

我写了一个相当简单的函数,可以从给定的URL下载图像,调整大小并上传到S3(使用'gm'和'knox'),但我不知道是否正确地将流读取到缓冲区中。(一切都正常工作,但这是正确的方式吗?)

另外,我想了解有关事件循环的一些内容,如何确定函数的一次调用不会泄漏任何内容或将“buf”变量更改为另一个已在运行的调用(或此情况不可能发生,因为回调是匿名函数?)

var http = require('http');
var https = require('https');
var s3 = require('./s3');
var gm = require('gm');

module.exports.processImageUrl = function(imageUrl, filename, callback) {
var client = http;
if (imageUrl.substr(0, 5) == 'https') { client = https; }

client.get(imageUrl, function(res) {
    if (res.statusCode != 200) {
        return callback(new Error('HTTP Response code ' + res.statusCode));
    }

    gm(res)
        .geometry(1024, 768, '>')
        .stream('jpg', function(err, stdout, stderr) {
            if (!err) {
                var buf = new Buffer(0);
                stdout.on('data', function(d) {
                    buf = Buffer.concat([buf, d]);
                });

                stdout.on('end', function() {
                    var headers = {
                        'Content-Length': buf.length
                        , 'Content-Type': 'Image/jpeg'
                        , 'x-amz-acl': 'public-read'
                    };

                    s3.putBuffer(buf, '/img/d/' + filename + '.jpg', headers, function(err, res) {
                        if(err) {
                            return callback(err);
                        } else {
                            return callback(null, res.client._httpMessage.url);
                        }
                    });
                });
            } else {
                callback(err);
            }
        });
    }).on('error', function(err) {
        callback(err);
    });
};

1
这些答案不能是真的,对吧?这个标准库函数在哪里? - jameshfisher
11个回答

0
您可以在res.headers中检查“content-length”头信息。这将告诉您将要接收的内容长度(它将发送多少字节的数据)。

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