Javascript 如何在node.js(AmazonWebServices上的Lambda函数)中用一个文件解压.gz归档文件?
我对JavaScript、AWS Lambda和node.js都是新手(因此基本上我对所有这些技术都是新手),但我也有一些Java开发经验 我正在尝试解压缩node.js应用程序/函数中的.gz文件,该应用程序/函数作为Lambda函数托管在AWS Lambda中。但是我不知道如何解压这个文件。这是我的密码: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
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...
}