Archiver combine/pipe with PassThrough(), append and finalize not a function - Nodejs 流
Archiver combine/pipe with PassThrough(), append and finalize not a function - Nodejs Stream
所以,我在 Axios 流的帮助下下载文件,用归档器压缩它们,然后我想将 zip 上传到 s3 存储桶。
起初,我将 zip 保存在本地目录中,一切正常。
我使用多管道库来组合流。
将存档器 zip 流与 fs.createWriteStream
相结合
function uploadFromStream(name) {
const output = fs.createWriteStream(__dirname + `/${name}.zip`);
const zip= combine(archive, output);
return zip
}
在axios端
zip.append(response.data.pipe(new PassThrough()), { name: name });
一切都按预期工作,Zip 正在保存其中的所有文件。
然后研究了一下怎么用stream上传到s3。
我找到了这种方式。
输入流
.pipe(uploadFromStream(s3));
function uploadFromStream(s3) {
var pass = new stream.PassThrough();
var params = {Bucket: BUCKET, Key: KEY, Body: pass};
s3.upload(params, function(err, data) {
console.log(err, data);
});
return pass;
}
我用这样的归档器实现了这个。
function uploadFromStream(bucket, destination) {
var pass = new stream.PassThrough();
var params = { Bucket: bucket, Key: destination, Body: pass };
S3.upload(params, function (err, data) {
console.log(err, data);
});
const s3Stream = combine(archive, pass);
return s3Stream;
}
现在,当我尝试追加时,出现错误 append not a function same when finalize is not a function。当我检查时,我发现 s3Stream.append 和 s3Stream.finalize 是未定义的。
我不认为它应该发生,但我猜 PassThrough 正在从组合流中删除函数。
像这样的管道流也不起作用。
return archive.pipe(pass);
所以在多次记录流之后。我认为 pipe 没有结合两个流的功能,而只是在两个流之间创建一个流。
所以我只需要通过管道传递 passThrough 和归档器,然后 return 归档器将文件附加到它。
function uploadFromStream(bucket, destination) {
const pass = new stream.PassThrough();
const params = { Bucket: bucket, Key: destination, Body: archive };
S3.upload(params, function (err, data) {
console.log(err, data);
});
archive.pipe(pass);
return archive;
}
通过这样做,我不会遇到上述错误。
我的缺点是第一次使用流
所以,我在 Axios 流的帮助下下载文件,用归档器压缩它们,然后我想将 zip 上传到 s3 存储桶。 起初,我将 zip 保存在本地目录中,一切正常。 我使用多管道库来组合流。 将存档器 zip 流与 fs.createWriteStream
相结合 function uploadFromStream(name) {
const output = fs.createWriteStream(__dirname + `/${name}.zip`);
const zip= combine(archive, output);
return zip
}
在axios端
zip.append(response.data.pipe(new PassThrough()), { name: name });
一切都按预期工作,Zip 正在保存其中的所有文件。
然后研究了一下怎么用stream上传到s3。
我找到了这种方式。
输入流 .pipe(uploadFromStream(s3));
function uploadFromStream(s3) {
var pass = new stream.PassThrough();
var params = {Bucket: BUCKET, Key: KEY, Body: pass};
s3.upload(params, function(err, data) {
console.log(err, data);
});
return pass;
}
我用这样的归档器实现了这个。
function uploadFromStream(bucket, destination) {
var pass = new stream.PassThrough();
var params = { Bucket: bucket, Key: destination, Body: pass };
S3.upload(params, function (err, data) {
console.log(err, data);
});
const s3Stream = combine(archive, pass);
return s3Stream;
}
现在,当我尝试追加时,出现错误 append not a function same when finalize is not a function。当我检查时,我发现 s3Stream.append 和 s3Stream.finalize 是未定义的。 我不认为它应该发生,但我猜 PassThrough 正在从组合流中删除函数。
像这样的管道流也不起作用。
return archive.pipe(pass);
所以在多次记录流之后。我认为 pipe 没有结合两个流的功能,而只是在两个流之间创建一个流。 所以我只需要通过管道传递 passThrough 和归档器,然后 return 归档器将文件附加到它。
function uploadFromStream(bucket, destination) {
const pass = new stream.PassThrough();
const params = { Bucket: bucket, Key: destination, Body: archive };
S3.upload(params, function (err, data) {
console.log(err, data);
});
archive.pipe(pass);
return archive;
}
通过这样做,我不会遇到上述错误。 我的缺点是第一次使用流