node.js Aws Lambda:getObject到base64

node.js Aws Lambda:getObject到base64,node.js,amazon-s3,aws-lambda,Node.js,Amazon S3,Aws Lambda,我在这里修改了zip函数,因为它只能压缩文本,不能压缩图像 问题出现在代码末尾的函数base64_encode中。我可以将base64字符串写入控制台,但不能将其返回给调用函数 欢迎任何帮助 让AWS=require('AWS-sdk'); 让JSZip=require(“JSZip”); 设fs=require(“fs”); const s3=新的AWS.s3(); 让基数=“”; exports.handler=函数(事件、上下文、回调){ 让myzip=event.zip; 设修改=0,

我在这里修改了zip函数,因为它只能压缩文本,不能压缩图像

问题出现在代码末尾的函数base64_encode中。我可以将base64字符串写入控制台,但不能将其返回给调用函数

欢迎任何帮助

让AWS=require('AWS-sdk');
让JSZip=require(“JSZip”);
设fs=require(“fs”);
const s3=新的AWS.s3();
让基数=“”;
exports.handler=函数(事件、上下文、回调){
让myzip=event.zip;
设修改=0,删除=0;
让mypath=event.path;
让mynewname=event.newname;
让filename=event.filename;
//获取压缩文件
s3.getObject({
“Bucket”:“tripmasterdata”,
“键”:event.path+'/'+myzip,
}).承诺
。然后(数据=>{
让jszip=newjszip();
loadAsync(data.Body)。然后(zip=>{
//添加或删除文件
如果(文件名!=''){
//在这里,我将图像作为base64编码字符串存储在zip中
thebase=base64_encode(我的路径、文件名、thebase);
log('AD:'+thebase);//回调(err))
.on('finish',function(){
log(`upload to${event.path}`);
s3.1对象({
“主体”:fs.createReadStream(tmpzip),
“桶”:“xxx/”+tmpPath,
“钥匙”:myzip,
“元数据”:{
“内容长度”:字符串(fs.statSync(tmpzip.size)
}
})
.承诺
。然后(数据=>{
log(`Successfully upload${event.path}`);
回调(null{
修改:修改,,
移除:移除
});
})
.catch(错误=>{
回调(err);
});
});
})
.catch(错误=>{
回调(err);
});
})
.catch(错误=>{
回调(err);
});
}
//函数,该函数应返回我的base64编码图像
函数base64_编码(路径、文件、thebase){
var leKey=path+'/'+文件;
变量参数={
'桶':“xxx”,
“键”:leKey
}
s3.getObject(参数、函数(错误、数据){
console.log('错误:'+错误);
}).promise().then(数据=>{
thebase=data.Body.toString('base64');

console.log('thebase:'+thebase);//这是一个与承诺相关的问题函数'return thebase;'中的最后一个调用很可能返回undefined,因为承诺尚未解析。当函数返回时。我发现使用关键字async和wait很有用,这确实将代码减少为更可读的格式(它使代码变得平坦很多)

然后在main函数中,您希望使用.Then()处理承诺

如果您使用的是async/await,它将如下所示:

async function base64_encode(path,file,thebase) {
  var leKey = path+'/'+file;
  var params = {
    'Bucket': "xxx",
    'Key': leKey
  }
  return s3.getObject(params).promise();
}

let thebase = await base64_encode('stuff');

希望这有帮助

太好了,确实是这个问题。非常感谢您的帮助。
async function base64_encode(path,file,thebase) {
  var leKey = path+'/'+file;
  var params = {
    'Bucket': "xxx",
    'Key': leKey
  }
  return s3.getObject(params).promise();
}

let thebase = await base64_encode('stuff');