我无法使用官方的AWS开发工具包将从MongoDB游标创建的流上传到S3。我正在使用Node版本8.16.1,最新的MongoDB驱动程序版本3.5.9和最新的AWS开发工具包版本2.698.0。
// db is a valid Db instance. The .find and .stream calls both return a Cursor
try {
const AWS = require('aws-sdk');
const stream = db.collection('collection')
.find({})
.stream({ transform: JSON.stringify });
const params = {
Key: 'path/to/object.json',
Bucket: 'bucket',
Body: stream,
};
const upload = new AWS.S3.ManagedUpload({ params });
upload.send();
} catch (error) {
console.log(error);
}
此代码导致以下错误:
TypeError: "list" argument must be an Array of Buffer or Uint8Array instances
at Function.Buffer.concat (buffer.js:446:13)
at ManagedUpload.fillStream (.../node_modules/aws-sdk/lib/s3/managed_upload.js:451:40)
at Cursor.<anonymous> (.../node_modules/aws-sdk/lib/s3/managed_upload.js:192:28)
at emitNone (events.js:111:20)
at Cursor.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickDomainCallback (internal/process/next_tick.js:219:9)
如果我尝试使用upload
API而不是构造ManagedUpload
对象来执行相同操作,则会收到相同的错误:
// ...
const S3 = new AWS.S3();
S3.upload(params, (err, data) => {
if (err) {
console.error(err);
}
});
// ...
作为一个额外的数据点,如果我将Node版本切换到12.17.0,则不会得到TypeError
,并且两个版本似乎都挂起而没有给出任何错误。另外,当params.Body
只是一个字符串时,同样的代码也可以正常工作。
在将Mongo客户端返回的流对象传递给S3之前,还需要做更多的事情吗?看起来S3客户端期望的东西与获得的东西有所不同。
谢谢。