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

Node.js 如何在异步函数中创建AWS S3对象的读取流?,node.js,amazon-web-services,amazon-s3,aws-lambda,async-await,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,Async Await,如何在异步函数中创建AWS S3对象的读取流 如果我尝试 exports.handler = async (event) => { var csvreadstream = await s3.getObject({ Bucket: bucket, Key: filename }).promise().createReadStream() } 或 我明白了 有人能建议如何使用异步(async/await)函数从S3对象创建读取流吗? 谢谢大家! 感谢Mark B,我更进一步: cons

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

如果我尝试

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

我明白了

有人能建议如何使用异步(async/await)函数从S3对象创建读取流吗? 谢谢大家!

感谢Mark B,我更进一步:

const AWS=require('AWS-sdk');
const-utils=require('./utils');
const csv=require('fast-csv');
const stream=require('stream');
const s3=新的AWS.s3();
exports.handler=异步(事件)=>{
log(“传入事件:”,JSON.stringify(事件));
const bucket=event.Records[0].s3.bucket.name;
const filename=decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g',);
const message=`文件上传到-${bucket}->${filename}`;
控制台日志(消息);
var错误=[];
const splittedFilename=filename.split('.');
const reportFilename=splittedFilename[0]+“Report.+splittedFilename[1];
const reportBucket='external.transactions.reports';
var s3object=(等待s3.getObject({Bucket:Bucket,Key:filename}).promise());
var csvreadstream=new stream.Readable();
csvreadstream._read=()=>{};
csvreadstream.push(s3object.Body);
csvreadstream
.pipe(csv.parse({headers:true}))
.on('data',异步函数(data){
这个。暂停();
console.log(“数据:”+数据);
等待utils.filterLogic(数据、错误);
这个是resume();
})
.on('end',异步函数(){
控制台日志(“结束”);
等待utils.writeErrorReport(错误、s3、reportBucket、reportFilename);
})

};在您的代码
s3Object中。Body
将返回一个缓冲区。然后,如果需要将缓冲区转换为流,您可以查看类似于答案的技术。

在代码
s3Object中。Body
将返回缓冲区。如果您需要将缓冲区转换为流,那么您可以查看类似于答案的技术。

晚会迟到了,但我相信您只是想做:

var readableStream = await s3.getObject({ Bucket: bucket, Key: filename }).createReadStream();

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

晚会迟到了,但我相信您只是想做:

var readableStream = await s3.getObject({ Bucket: bucket, Key: filename }).createReadStream();

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

非常感谢Mark B。是的,这很有效!var s3object=(等待s3.getObject({Bucket:Bucket,Key:filename}).promise());var csvreadstream=new stream.Readable();csvreadstream._read=()=>{};csvreadstream.push(s3object.Body);非常感谢马克B。是的,很有效!var s3object=(等待s3.getObject({Bucket:Bucket,Key:filename}).promise());var csvreadstream=new stream.Readable();csvreadstream._read=()=>{};csvreadstream.push(s3object.Body);
var readableStream = await s3.getObject({ Bucket: bucket, Key: filename }).createReadStream();