将MongoDB Cursor流上传到AWS S3时出错

时间:2020-06-16 20:12:12

标签: mongodb amazon-s3 node-mongodb-native aws-sdk-js node-streams

我无法使用官方的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客户端期望的东西与获得的东西有所不同。

谢谢。

0 个答案:

没有答案