Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js关闭readstream末尾的writestream_Node.js_Amazon S3_Async Await_Stream_Es6 Promise - Fatal编程技术网

Node.js关闭readstream末尾的writestream

Node.js关闭readstream末尾的writestream,node.js,amazon-s3,async-await,stream,es6-promise,Node.js,Amazon S3,Async Await,Stream,Es6 Promise,我正在读取AWS S3上存储的csv文件。这些csv记录由名为filterLogic()的函数进行计算。测试失败的记录也需要写入AWS S3上的错误报告csv文件中。对于csv解析,我使用fast csv 但是,对于最后一条记录,我得到一个“错误[ERR\u STREAM\u WRITE\u AFTER\u END]:WRITE AFTER END” 我需要在哪里以及如何正确调用csvwritestream.end() const AWS=require('AWS-sdk'); const-u

我正在读取AWS S3上存储的csv文件。这些csv记录由名为filterLogic()的函数进行计算。测试失败的记录也需要写入AWS S3上的错误报告csv文件中。对于csv解析,我使用fast csv

但是,对于最后一条记录,我得到一个
“错误[ERR\u STREAM\u WRITE\u AFTER\u END]:WRITE AFTER END”

我需要在哪里以及如何正确调用
csvwritestream.end()

const AWS=require('AWS-sdk');
const-utils=require('./utils');
const csv=require('fast-csv');
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}`;
控制台日志(消息);
const splittedFilename=filename.split('.');
const reportFilename=splittedFilename[0]+“Report.+splittedFilename[1];
const reportBucket='external.transactions.reports';
const csvwritestream=csv.format({headers:true});
csvwritestream
.pipe(utils.uploadFromStream(s3、reportBucket、reportFilename))
.on('end',函数(){
log(“报告写入S3”+报告文件名);
});
var request=s3.getObject({Bucket:Bucket,Key:filename});
var stream=request.createReadStream({objectMode:true})
.pipe(csv.parse({headers:true}))
.on('data',异步函数(data){
stream.pause();
log(“JSON:+JSON.stringify(数据));
var响应=等待utils.filterLogic(数据);
如果(response.statusCode!==200){
等待csvwritestream.write(数据);
log(“数据:+JSON.stringify(数据)+“writed”);
}
stream.resume();
})
.on('end',function(){
csvwritestream.end();
});
返回新承诺(解决=>{
stream.on('close',异步函数(){
csvwritestream.end();
解决();
});
});

};错误的原因很简单。这里的主要问题是,在中没有等待侦听器
数据
,因此您可能希望数据处理按顺序开始,但完成的时间不是。现在,考虑到这一点,请注意,
end
事件在最后一个
数据
事件之后立即触发,因此,在写入流关闭后,最后处理的一些项的写入操作将完成。。。是的,我知道您确实暂停了,但是在
异步函数中
您是在节点处理同步内容之后暂停的,
end
是其中之一

您可以做的是实现一个转换流,但考虑到您的用例,这可能比仅仅使用另一个模块要复杂得多——比如我的模块,它将允许您在数据过滤器中运行异步代码

const AWS=require('AWS-sdk');
const-utils=require('./utils');
const{StringStream}=require('scramjet');
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}`;
控制台日志(消息);
const splittedFilename=filename.split('.');
const reportFilename=splittedFilename[0]+“Report.+splittedFilename[1];
const reportBucket='external.transactions.reports';
var request=s3.getObject({Bucket:Bucket,Key:filename});
var stream=StringStream
//从超音速燃烧冲压发动机气流中创建StringStream
.来自(
request.createReadStream()
)
//然后解析数据
.CSVParse({headers:true})
//然后使用异步函数进行过滤,就像它是一个数组一样
.filter(异步数据=>{
var响应=等待utils.filterLogic(数据);
返回response.statusCode==200;
})
//然后严格化
.CSVStringify({headers:true})
//然后上传
.烟斗(
uploadFromStream(s3,reportBucket,reportFilename)
);
回报新的承诺(
(res,rej)=>流
.on(“完成”,res)
.on(“错误”,rej)
);
};
超音速燃烧冲压发动机将负责从上述方法中创建一条流管道,因此您不需要暂停/恢复-所有这些都已处理完毕

您可能需要阅读:


哦,超燃冲压发动机只增加了3个DEP,所以你们的节点模块不会是那个相对论笑话的例子

错误的原因是而且不简单。这里的主要问题是,在中没有等待侦听器
数据
,因此您可能希望数据处理按顺序开始,但完成的时间不是。现在,考虑到这一点,请注意,
end
事件在最后一个
数据
事件之后立即触发,因此,在写入流关闭后,最后处理的一些项的写入操作将完成。。。是的,我知道您确实暂停了,但是在
异步函数中
您是在节点处理同步内容之后暂停的,
end
是其中之一

您可以做的是实现一个转换流,但考虑到您的用例,这可能比仅仅使用另一个模块要复杂得多——比如我的模块,它将允许您在数据过滤器中运行异步代码

const AWS=require('AWS-sdk');
const-utils=require('./utils');
const{StringStream}=require('scramjet');
const s3=新的AWS.s3();
exports.handler=异步(事件)=>{