node.js - home - transmitir la respuesta de la solicitud de nodejs a s3
npm node js (2)
Como tenía el mismo problema que @JoshSantangelo (archivos de cero bytes en S3) con [email protected] y [email protected], permítanme agregar una solución alternativa utilizando el propio módulo http
Node (advertencia: código simplificado de un real proyecto de vida y no probado por separado):
var http = require(''http'');
function copyToS3(url, key, callback) {
http.get(url, function onResponse(res) {
if (res.statusCode >= 300) {
return callback(new Error(''error '' + res.statusCode + '' retrieving '' + url));
}
s3.upload({Key: key, Body: res}, callback);
})
.on(''error'', function onError(err) {
return callback(err);
});
}
Por lo que puedo decir, el problema es que la request
no es totalmente compatible con la API actual de flujos de nodos, mientras que aws-sdk
depende de ello.
Referencias
¿Cómo se usa la solicitud para descargar el contenido de un archivo y transmitirlo directamente a s3 utilizando el aws-sdk para el nodo?
El código que se muestra a continuación me da el Object #<Request> has no method ''read''
que hace que parezca que la solicitud no devuelve una secuencia de lectura ...
var req = require(''request'');
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}});
var imageStream = req.get(url)
.on(''response'', function (response) {
if (200 == response.statusCode) {
//imageStream should be read()able by now right?
s3.upload({Body: imageStream, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months
console.log(err,data);
});
}
});
});
Según aws-sdk docs, el Body
debe ser un objeto ReadableStream
.
¿Qué estoy haciendo mal aquí?
Esto se puede sacar usando el módulo s3-upload-stream , sin embargo, prefiero limitar mis dependencias.
Desea utilizar el objeto de response
si está escuchando manualmente la secuencia de respuesta:
var req = require(''request'');
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}});
var imageStream = req.get(url)
.on(''response'', function (response) {
if (200 == response.statusCode) {
s3.upload({Body: response, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months
console.log(err,data);
});
}
});
});