У меня проблемы с загрузкой потока, созданного из курсора 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 ожидает чего-то другого, чем то, что он получает.
Спасибо.