我试图弄清楚如何通过我在 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);
)。但这也没有用。
在这一点上我有点茫然,所以任何指导将不胜感激!