Ошибка при загрузке потока курсора MongoDB в AWS S3 - PullRequest
0 голосов
/ 16 июня 2020

У меня проблемы с загрузкой потока, созданного из курсора MongoDB, на S3 с использованием официального AWS SDK. Я использую Node версии 8.16.1, последнюю версию драйвера MongoDB 3.5.9 и последнюю AWS SDK версии 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 - это просто строка.

Есть ли что-то еще, что нужно сделать с объектом потока, возвращаемым клиентом Mon go, перед его передачей на S3? Похоже, клиент S3 ожидает чего-то другого, чем то, что он получает.

Спасибо.

...