Node.js: Wie lese ich einen Stream in einen Puffer?

Ich habe eine ziemlich einfache Funktion geschrieben, die ein Bild von einer bestimmten URL herunterlädt, seine Größe ändert und es in S3 hochlädt (unter Verwendung von 'gm' und 'knox'). Ich habe keine Ahnung, ob ich einen Stream in einen Puffer richtig lese . (Alles funktioniert, aber ist es der richtige Weg?)

Außerdem möchte ich etwas über die Ereignisschleife verstehen. Woher weiß ich, dass bei einem Aufruf der Funktion nichts verloren geht oder die Variable 'buf' in einen anderen bereits ausgeführten Aufruf geändert wird (oder dieses Szenario ist unmöglich, da die Rückrufe anonym sind Funktionen?)

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);
    });
};

Antworten auf die Frage(5)

Ihre Antwort auf die Frage