Node.js/Restify で作成している RESTful API を介して Amazon S3 バケットにデータをアップロードする方法を見つけようとしています。基本的な概念はすべて機能していると思いますが、POST リクエストの本文に接続しようとすると、問題が発生します。単純に文字列を S3 に渡すようにコールバック関数を設定すると、問題なく動作し、適切な S3 バケットにファイルが作成されます。
function postPoint(req, res, next) {
var point = [
{ "x": "0.12" },
{ "y": "0.32" }
];
var params = { Bucket: 'myBucket', Key: 'myKey', Body: JSON.stringify(point) };
s3.client.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});
res.send(200);
return next();
}
server.post('/point', postPoint);
明らかに、最終的にリクエストの本文からリクエストをストリーミング/パイプする必要があります。私がする必要があるのは、単にパラメーターの本体を要求ストリームに切り替えることだけだと思いました。
function postPoint(req, res, next) {
var params = { Bucket: 'myBucket', Key: 'myKey', Body: req };
s3.client.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});
res.send(200);
return next();
}
しかし、それにより、次のようなログ メッセージが表示されることになります。「データのアップロード中にエラーが発生しました: [TypeError: パスは文字列である必要があります]」。最終的には、送信されるデータが非常に大きくなる可能性があるため、結果をパイプできるようにしたいので (前の例で本体がメモリに格納されているかどうかはわかりません)、このようなものが機能する可能性があると考えました。 :
function postPoint(req, res, next) {
var params = { Bucket: 'myBucket', Key: 'myKey', Body: req };
req.pipe(s3.client.putObject(params));
res.send(200);
return next();
}
うまく機能するGET関数で同様のことを行ったので:( s3.client.getObject(params).createReadStream().pipe(res);
)。しかし、それもうまくいきませんでした。
この時点で少し途方に暮れているので、ガイダンスをいただければ幸いです。