rus*_*ell 2 tar amazon-s3 node.js node.js-stream aws-sdk
(下面的新信息)我正在尝试设置一个lambda函数,通过解压缩并将结果写回S3,对上传的tgz文件作出反应.解压缩和解压缩工作正常,但上传到S3失败:
/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350
var buf = self.body.read(self.partSize - self.partBuffer.length) ||
^
TypeError: undefined is not a function
at ManagedUpload.fillStream (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:350:25)
at Entry.<anonymous> (/Users/russell/lambda/gzip/node_modules/aws-sdk/lib/s3/managed_upload.js:167:28)
at Entry.emit (events.js:104:17)
at Entry._read (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:123:12)
at Entry.end (/Users/russell/lambda/gzip/node_modules/tar/lib/entry.js:82:8)
at Parse._process (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:107:13)
at BlockStream.<anonymous> (/Users/russell/lambda/gzip/node_modules/tar/lib/parse.js:47:8)
at BlockStream.emit (events.js:107:17)
at BlockStream._emitChunk (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:145:10)
at BlockStream.write (/Users/russell/lambda/gzip/node_modules/tar/node_modules/block-stream/block-stream.js:45:10)
Run Code Online (Sandbox Code Playgroud)
当我写入S3时会发生此错误,但如果我将文件本地写入磁盘则可以正常工作,因此管道是正确的.
以下是演示此问题的代码:
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var zlib = require('zlib');
var tar = require('tar');
var fstream = require('fstream');
fstream.Reader({'path': 'testdata.tar.gz'})
.pipe(zlib.Unzip())
.pipe(tar.Parse())
.on('entry', function(entry) {
var filename = entry.path;
console.log('got ' + entry.type + ' ' + filename);
if (entry.type == 'File') {
if (1) { // switch between working and nonworking cases
s3.upload({Bucket: 'my_bucket', Key: 'gunzip-test/' + filename, Body: entry}, {},
function(err, data) {
if (err)
console.log('ERROR!');
else
console.log('OK');
});
}
else {
entry.pipe(fstream.Writer({ 'path': '/tmp/mytest/' + filename }));
}
}
});
Run Code Online (Sandbox Code Playgroud)
如果代码设置为写入S3,则会因上述错误而失败,如果它在本地写入提取的文件则成功.ENTRY是一个流,并且根据doc应该在上传Body参数中接受.我在ManagedUpload中放置了一个print语句,失败来了,并确认self.body是一个流:
var stream = require('stream');
console.log('is it a stream? ' + ((self.body instanceof stream) ? 'yes' : 'no'));
console.log('self.body.read is ' + self.body.read);
Run Code Online (Sandbox Code Playgroud)
回报
$ got File gunzip.js
is it a stream? yes
self.body.read is undefined
Run Code Online (Sandbox Code Playgroud)
我是aws和node.js的新手,所以可能存在一个基本问题,但是我花了一天时间才发现它.我使用unzip而不是gzip进行了上传调用,并且它有效(使用lambda函数解压缩S3中的档案真的很懒)有人能指出我在这段代码中做错了吗?
谢谢
我想我明白了一点.我将管道分成碎片,看着每一个.问题是tar.Parse使用fstream而不是stream.如果我查看.pipe(tar.Parse())语句的返回它是一个流,但它不是stream.Readable或stream.Writable.fstream没有定义read()方法(它的读者基于Stream,它不是stream.Readable),所以tar.Parse,它基于Stream,也没有.
所以问题的一个改进是,这是fstream中的一个错误,还是fstream不是一个流?我认为这是一个错误 - 来自自述文件:
"就像FS流一样,但它们带有stat,支持目录和符号链接,以及普通文件.此外,你可以使用它来设置文件的统计数据,即使你不改变它的内容,或者创建一个符号链接等."
Jak*_*lik 15
在我的情况下通过stream.PassThrough运行流帮助.
var PassThrough = require('stream').PassThrough;
var stream = getStreamSomeHow();
var passthrough = new PassThrough();
stream.pipe(passthrough);
s3.upload({...,Body:passthrough}) //
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2487 次 |
最近记录: |