使用密码压缩两次,并使用Node.js、Lambda&;SES

使用密码压缩两次,并使用Node.js、Lambda&;SES,node.js,aws-lambda,amazon-ses,Node.js,Aws Lambda,Amazon Ses,我正在尝试使用archiver zip encrypted node.js模块对文件进行两次压缩。当我尝试本地机器时,该文件能够使用加密AES256中的密码压缩两次。但是,当我在Lambda中尝试相同的方法时,它在本地的行为并不相同。我尝试附加这两个文件,我注意到第一个zip文件里面有实际的文件,但我在创建第二个zip文件时遇到了问题,因为它里面有一个空白文件 var aws = require('aws-sdk'); var nodemailer = require('nodemailer')

我正在尝试使用archiver zip encrypted node.js模块对文件进行两次压缩。当我尝试本地机器时,该文件能够使用加密AES256中的密码压缩两次。但是,当我在Lambda中尝试相同的方法时,它在本地的行为并不相同。我尝试附加这两个文件,我注意到第一个zip文件里面有实际的文件,但我在创建第二个zip文件时遇到了问题,因为它里面有一个空白文件

var aws = require('aws-sdk');
var nodemailer = require('nodemailer');
var ses = new aws.SES();
const archiver = require('archiver');
const stream = require('stream')
var fs = require('fs');
var async = require('async');

exports.handler = function (event, context, callback) {

    const filepath = event.filepath;
    const filename =  event.file;
    const email = event.email;
    const bucket = "BUCKETNAME";
    const filepathZip = '/tmp/'+filename +'.zip';
    const filenameZip = filename +'.zip';

    var s3 = new aws.S3();
    var options = {
        Bucket:bucket,
        Key: 'files/' + filename
    };

    var fileStream = s3.getObject(options).createReadStream();

    archiver.registerFormat('zip-encrypted', require("archiver-zip-encrypted"));
    var output = fs.createWriteStream(filepathZip);

    var randampassword = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
    let archive = archiver.create('zip-encrypted', {zlib: {level: 8}, encryptionMethod: 'aes256', password: randampassword });
    output.on('close', function() {
        console.log(archive.pointer() + ' total bytes ');
        console.log('archiver has been finalized and the output file descriptor has closed.');
        console.log(randampassword);
    });
    archive.on('err', function(err) {
        throw err;
    });
 var FinalZip = '/tmp/'+filename +'_final.zip'; 
  let archive_final = archiver.create('zip-encrypted', {zlib: {level: 8}, encryptionMethod: 'aes256', password: randampassword });
  var output_final = fs.createWriteStream(FinalZip)
    async.waterfall([
        function(callback){
            archive.pipe(output); 
            archive.append(fileStream, { name: filename }).finalize();
            archive_final.pipe(output_final);
            archive_final
        .file(filepathZip, { name: filenameZip })
        .finalize(); 
        }
      ]);
    getS3File('BUCKETNAME', 'test.txt')
        .then(function (fileData) {
            var mailOptions = {
                from: 'SENDER',
                subject: 'This is an email sent from a Lambda function!',
                html: `<p>You got a contact message from: <b>${event.email}</b> paasword: <b>${randampassword}</b></p>`,
                to: 'RECEIVER',
                // bcc: Any BCC address you want here in an array,
                attachments: [
                    {
                        filename: "attach.zip",
                        path: filepathZip
                    }
                ]
            };

            console.log('Creating SES transporter');
            var transporter = nodemailer.createTransport({
                SES: ses
            });

            transporter.sendMail(mailOptions, function (err, info) {
                if (err) {
                    console.log(err);
                    console.log('Error sending email');
                    callback(err);
                } else {
                    console.log('Email sent successfully');
                    callback();
                }
            });
        })
        .catch(function (error) {
            console.log(error);
            console.log('Error getting attachment from S3');
            callback(error);
        });
};
var aws=require('aws-sdk');
var nodeEmailer=require('nodeEmailer');
var ses=新的aws.ses();
const-archiver=require('archiver');
const stream=require('stream')
var fs=需要('fs');
var async=require('async');
exports.handler=函数(事件、上下文、回调){
const filepath=event.filepath;
const filename=event.file;
const email=event.email;
const bucket=“BUCKETNAME”;
const filepathZip='/tmp/'+filename+'.zip';
const filenameZip=filename+'.zip';
var s3=新的aws.s3();
变量选项={
桶:桶,
键:“files/”+文件名
};
var fileStream=s3.getObject(options).createReadStream();
registerFormat('zip-encrypted',require('archiver-zip-encrypted');
var output=fs.createWriteStream(filepathZip);
var randampassword=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);
让archive=archiver.create('zip-encrypted',{zlib:{level:8},encryptionMethod:'aes256',密码:randampassword});
output.on('close',function(){
log(archive.pointer()+'总字节');
log('归档程序已完成,输出文件描述符已关闭');
console.log(randampassword);
});
存档.on('err',函数(err){
犯错误;
});
var FinalZip='/tmp/'+filename+''u final.zip';
让archive_final=archiver.create('zip-encrypted',{zlib:{level:8},encryptionMethod:'aes256',密码:randampassword});
var output_final=fs.createWriteStream(FinalZip)
异步瀑布([
函数(回调){
归档.管道(输出);
append(fileStream,{name:filename}).finalize();
归档最终管道(输出最终管道);
档案室期末考试
.file(filepathZip,{name:filenameZip})
.finalize();
}
]);
getS3File('BUCKETNAME','test.txt')
.then(函数(文件数据){
var mailpoptions={
发件人:,
主题:“这是Lambda函数发送的电子邮件!”,
html:`您收到了来自以下地址的联系信息:${event.email}paasword:${randampassword}

`, 致:“接收者”, //密件抄送:数组中所需的任何密件抄送地址, 附件:[ { 文件名:“attach.zip”, 路径:filepathZip } ] }; console.log('创建SES transporter'); var transporter=nodeEmailer.createTransport({ SES:SES }); transporter.sendMail(邮件选项,函数(错误,信息){ 如果(错误){ 控制台日志(err); console.log(“发送电子邮件时出错”); 回调(err); }否则{ console.log(“电子邮件发送成功”); 回调(); } }); }) .catch(函数(错误){ console.log(错误); log('从S3获取附件时出错'); 回调(错误); }); };
您不必执行
存档\u final.append
我使用了
存档\u final.file(filepathZip,{name:filenameZip}).finalize()
要压缩第二个archiveDo,您必须使用瀑布