Javascript 如何在node.js(AmazonWebServices上的Lambda函数)中用一个文件解压.gz归档文件?

Javascript 如何在node.js(AmazonWebServices上的Lambda函数)中用一个文件解压.gz归档文件?,javascript,node.js,aws-lambda,gzip,Javascript,Node.js,Aws Lambda,Gzip,我对JavaScript、AWS Lambda和node.js都是新手(因此基本上我对所有这些技术都是新手),但我也有一些Java开发经验 我正在尝试解压缩node.js应用程序/函数中的.gz文件,该应用程序/函数作为Lambda函数托管在AWS Lambda中。但是我不知道如何解压这个文件。这是我的密码: var async = require('async'); var JSZip = require('jszip'); var AWS = require('aws-sdk'); va

我对JavaScript、AWS Lambda和node.js都是新手(因此基本上我对所有这些技术都是新手),但我也有一些Java开发经验

我正在尝试解压缩node.js应用程序/函数中的.gz文件,该应用程序/函数作为Lambda函数托管在AWS Lambda中。但是我不知道如何解压这个文件。这是我的密码:

var async = require('async');
var JSZip  = require('jszip');
var AWS = require('aws-sdk');

var s3 = new AWS.S3();

exports.handler = function(event, context, callback) {
    // Read options from the event.
   console.log("AWS Function Start!");

    var srcBucket = event.Records[0].s3.bucket.name;
    // Object key may have spaces or unicode non-ASCII characters.
    var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));  

    async.waterfall([
        function download(next) {
            // Download the gz file from S3 into a buffer and pass the buffer to next function
            s3.getObject({
                    Bucket: srcBucket,
                    Key: srcKey
                },
                next);
            },

        function secondFunction(response, next) {
            console.log("scondFunction")

            var zip = new JSZip(response.body);
             async.forEach(zip.files, function (zippedFile) {

            var f = zippedFile;
            console.log(f.name);
             });

        }], function (err) {
            if (err) {
                console.error("error");
            } else {
                console.log("success");
            }

            callback(null, "message");
        }
    );

};
因此,我首先从AmazonS3加载一个aws对象(即.gz归档文件)。这很好,我想我有这个文件(作为bytestream)。所以我认为,我上传的Lambda包是可以的,因为我使用npm安装了所需的libs。但在AWS Lambda中触发该函数时,我会收到以下错误消息:

2017-06-11T15:55:18.612Z    ef56fbfe-4ebd-11e7-ad06-05089152cc1f    Error: The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.
at Object.JSZip (/var/task/node_modules/jszip/lib/index.js:14:15)
at secondFunction (/var/task/AwsHtwFunction.js:28:14)
at nextTask (/var/task/node_modules/async/dist/async.js:5273:14)
at Response.next (/var/task/node_modules/async/dist/async.js:5280:9)
at Response.<anonymous> (/var/task/node_modules/async/dist/async.js:906:16)
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:360:18)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:673:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)

由于我不知道如何在(node)JS中实现,而且AWS Lambda也支持Java,所以我设法使用Java实现了这一点:

GZIPInputStream gzis = new GZIPInputStream(myInputStream);
InputStreamReader reader_gz = new InputStreamReader(gzis);
BufferedReader bufferedReader = new BufferedReader(reader_gz); 

while ((readedLine = bufferedReader.readLine()) != null) {
     //It is a text file, so I can read it line per line
     //do sth. with line...
}

您现在有什么版本的jszip?谢谢您的快速回复!根据我的package.json文件,npm安装了jzip的1.0.0版。这似乎与aws lambda无关。看起来您只需要花时间查看JSZIPAPI,并更改代码以正确使用它。错误消息特别告诉您不要使用接受参数的构造函数。您是在复制旧示例中的代码还是什么?查看官方API文档中的示例以了解如何使用该库应该是很简单的:另外,您不应该循环响应体中的文件并将每个文件发送到解压库,而不是尝试解压整个响应体吗?我不确定循环,但据我所知,gz归档文件只能包含一个文件,不能包含多个文件。如果你想在一个gz档案中有多个文件,你必须先创建一个tar球。
GZIPInputStream gzis = new GZIPInputStream(myInputStream);
InputStreamReader reader_gz = new InputStreamReader(gzis);
BufferedReader bufferedReader = new BufferedReader(reader_gz); 

while ((readedLine = bufferedReader.readLine()) != null) {
     //It is a text file, so I can read it line per line
     //do sth. with line...
}