node.js Aws Lambda: получить объект для base64 - PullRequest
0 голосов
/ 14 января 2019

Я изменил функцию zip здесь https://dzone.com/articles/serverless-zipchamp-update-your-zip-files-in-s3-al, потому что она может только зашифровать текст, а не заархивировать изображения.

Проблема возникает в функции base64_encode в конце кода. Я могу записать строку base64 в консоль, но не могу вернуть ее вызывающей функции.

Любая помощь приветствуется.

let AWS = require('aws-sdk');
let JSZip = require("jszip");
let fs = require("fs");
const s3 = new AWS.S3();
let thebase='';


exports.handler = function (event, context, callback) {
    let myzip = event.zip;
    let modified = 0, removed = 0;
    let mypath = event.path;
    let mynewname = event.newname;
    let filename = event.filename;

	//get Zip file
    s3.getObject({
        'Bucket': "tripmasterdata",
        'Key': event.path+'/'+myzip,
       
    }).promise()
        .then(data => {
            let jszip = new JSZip();
            jszip.loadAsync(data.Body).then(zip => {
                // add or remove file
                if (filename !== '') {
                      //here I get the Image to be stored in the zip as base64 encoded string
                      thebase = base64_encode(mypath,filename,thebase);
                      console.log('AD:'+thebase); //<- this is always empty, WHY????
                      zip.file(mynewname, thebase, {createFolders: false,compression: "STORE",base64: true});
                      modified++;
                } else {
                      console.log(`Remove ${filename}`);
                      zip.remove(filename);
                      removed++;
                }

                let tmpzip = `/tmp/${myzip}`
                let tmpPath = `${event.path}`
                //Generating the zip
                console.log(`Writing to temp file ${tmpzip}`);
                zip.generateNodeStream({ streamFiles: true })
                    .pipe(fs.createWriteStream(tmpzip))
                    .on('error', err => callback(err))
                    .on('finish', function () {
                        console.log(`Uploading to ${event.path}`);
                        s3.putObject({
                            "Body": fs.createReadStream(tmpzip),
                            "Bucket": "xxx/"+tmpPath,
                            "Key": myzip,
                            "Metadata": {
                                "Content-Length": String(fs.statSync(tmpzip).size)
                            }
                        })
                            .promise()
                            .then(data => {
                                console.log(`Successfully uploaded ${event.path}`);
                                callback(null, {
                                    modified: modified,
                                    removed: removed
                                });
                            })
                            .catch(err => {
                                callback(err);
                            });
                    });
            })
                .catch(err => {
                    callback(err);
                });
        })
        .catch(err => {
            callback(err);
        });
}
//function that should return my base64 encoded image
function base64_encode(path,file,thebase) {
    var leKey = path+'/'+file;
    var params = {
    'Bucket': "xxx",
        'Key': leKey
    }
   s3.getObject(params, function(error, data) {
        console.log('error: '+error);
     	}).promise().then(data => {
        	thebase = data.Body.toString('base64');
        	console.log('thebase: '+thebase); //<- here I see the base64 encoded string
        	return thebase; //<- does not return thebase
       });
      return thebase; //<- does not return thebase
}

1 Ответ

0 голосов
/ 14 января 2019

Это проблема, связанная с обещаниями, последний вызов функции 'return thebase;' скорее всего вернет неопределенное, так как обещание еще не выполнено. когда функция возвращается. Я считаю полезным использовать ключевые слова async и ожидать, что это действительно превращает код в гораздо более читаемый формат (он значительно выравнивает код).

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

Затем в основной функции вы хотите обработать обещание с помощью .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');

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...