如何在异步函数中创建 AWS S3 对象的读取流?

Hom*_*mer 2 amazon-s3 amazon-web-services node.js async-await aws-lambda

如何在异步函数中创建 AWS S3 对象的读取流?

如果我尝试

exports.handler = async (event) => {
  var csvreadstream = await s3.getObject({ Bucket: bucket, Key: filename }).promise().createReadStream()
}
Run Code Online (Sandbox Code Playgroud)

或者

exports.handler = async (event) => {
  var s3Object = await s3.getObject({ Bucket: bucket, Key: filename }).promise();
  var csvreadstream = s3Object.createReadStream();
}
Run Code Online (Sandbox Code Playgroud)

我明白了

{
  "errorType": "TypeError",
  "errorMessage": "(intermediate value).createReadStream is not a function",
  "trace": [
    "TypeError: (intermediate value).createReadStream is not a function",
    "    at Runtime.exports.handler (/var/task/app.js:29:86)",
    "    at processTicksAndRejections (internal/process/task_queues.js:94:5)"
  ]
}
Run Code Online (Sandbox Code Playgroud)

谁能建议如何以异步(异步/等待方式)函数从 S3 对象创建读取流?谢谢你!

感谢 Mark BI,我又向前迈进了一步:

exports.handler = async (event) => {
  var csvreadstream = await s3.getObject({ Bucket: bucket, Key: filename }).promise().createReadStream()
}
Run Code Online (Sandbox Code Playgroud)

但是,该流似乎没有得到处理,例如调用.on() 有人有如何在异步函数中处理读取流的建议吗?非常感谢你的帮助。

Avi*_*hen 14

聚会迟到了,但我相信你只是想做:

var readableStream = await s3.getObject({ Bucket: bucket, Key: filename }).createReadStream();
Run Code Online (Sandbox Code Playgroud)

这将返回一个可读流,而无需使用 .promise() 预先下载整个对象并等待其解析,然后在下载整个缓冲区后将其手动转换为可读流。