问题描述
我需要通过http请求触发一个过程,在该过程中,我从S3下载一些数据,对数据进行压缩,修改流,对它进行gzip,然后发送到S3中的另一个存储桶。
到目前为止,我能够:
- 下载
- Gunzip
- 修改(过滤)数据
- 返回数据
或者:
- 下载
- Gunzip
- Gzip
- 上传未修改的数据并检索对象的url
我的第一个尝试包括使用gunzip流中的 on('data')事件来修改数据;然后当引发“结束”事件时,我可以将其返回给发出请求的浏览器。
var accumulator = [];
gunzip.on('data',chunk=>{
var lines = chunk.toString('utf-8').split(\n);
lines.forEach(line=>{
if(shouldBeFiltered(line)){
accumulator.push(line);
}
})
})
gunzip.on('end',()=>{
res.send(accumulator);
})
getS3.pipe(gunzip)
如果我不返回结果(res.send),而是尝试将gunzip传递给gzip,则忽略过滤器。之所以有意义,是因为我有一个 accumulator 数组,在引发结束事件时我返回了(在前面的情况下)。
然后,在进行一些挖掘之后,我发现了一个参考文献,建议应将数据推入,然后尝试了以下操作,但这是行不通的:
gunzip.on('data',chunk=>{
var lines = chunk.toString('utf-8').split(\n);
lines.forEach(line=>{
if(shouldBeFiltered(line)){
gunzip.push(line);
}
})
})
// the end event no longer mattered
// gunzip.on('end',()=>{
// res.send(accumulator);
// })
getS3.pipe(gunzip).pipe(gzip).pipe(putS3(putS3param.Key,putS3param.Bucket));
然后我尝试创建一个转换流(在尝试该概念时,这非常简化),但是随后出现内部错误:
const stream = require('stream');
const Transform = stream.Transform;
function filter(pipeline) {
var the_filter = new Transform({
transform(chunk,encoding,next) {
console.log();
chunk += Buffer('Modified','utf-8');
this.push(chunk);
next();
}
});
pipeline.pipe(the_filter);
}
除了创建文件并将其gzip压缩并上传外,我没有其他想法。
感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)