0

Я пытаюсь создать навык для Amazon Echo, который будет вызывать JSON-файл с AWS S3. Когда я вызываю код из s3 basic get function, он работает. И код Amazon Alexa работает сам по себе.Функция aws lambda s3 не вызвана внутри набора навыков алексей

Но когда я их называю, функция пропускается. Таким образом, для следующего кода консоль вызывается до и после s3.getObject(). Но средний пропущен. Я не понимаю, почему.

Я также проверил, был ли вызван s3, и это так.

let aws = require('aws-sdk'); 
let s3 = new aws.S3({ apiVersion: '2006-03-01'}); 

function callS3() { 
    console.log('loading S3 function'); 
    var myData = []; 

    const params = { 
     Bucket: 'cvo-echo', 
     Key: 'data.json' 
    }; 
    console.log("trying to get s3"); 
    s3.getObject(params, (err, data) => { 
     if (err) { 
      console.log('error in s3 get: \n' + err); 
      //const message = `Error getting object ${key} from bucket ${bucket}. 
      // Make sure they exist and your bucket is in same region as this function. 
      //console.log(message); 
     } else { 
      console.log('CONTENT TYPE: ', data.ContentType); 
      console.log('Data body: \n' + data.Body.toString()); 
      myData = JSON.parse(data.Body.toString()); 
      console.log('myData.length = ' + myData.length); 
     } 
     console.log('myData >> ' + myData); 
    }); 

    console.log('finished callS3() func'); 
    return myData; 
} 

ответ

0

Это может быть проблема управления потоком, я работал с амазонками SDK до и была запущена в подобные вопросы. Попробуйте ввести async в свой код, чтобы лучше контролировать, что происходит, когда. Таким образом, методы не будут пропускаться.

UPDATE: добавление некоторых примеров кода того, что вы могли бы сделать.

function callS3(callback) { 
    console.log('loading S3 function'); 
    var myData = []; 

    const params = { 
     Bucket: 'cvo-echo', 
     Key: 'data.json' 
    }; 
    console.log("trying to get s3"); 
    s3.getObject(params, (err, data) => { 
     if (err) { 
      console.log('error in s3 get: \n' + err); 
      //const message = `Error getting object ${key} from bucket ${bucket}. 
      // Make sure they exist and your bucket is in same region as this function. 
      //console.log(message); 

      callback(err,null);//callback the error. 
     } else { 
      console.log('CONTENT TYPE: ', data.ContentType); 
      console.log('Data body: \n' + data.Body.toString()); 
      myData = JSON.parse(data.Body.toString()); 
      console.log('myData.length = ' + myData.length); 

      console.log('myData >> ' + myData); 
      console.log('finished callS3() func'); 

      //Include the callback inside of the S3 call to make sure this function returns until the S3 call completes. 
      callback(null,myData); // first element is an error and second is your data, first element is null if no error ocurred. 
     } 
    }); 

} 

/* 
This MIGHT work without async but just in case you can read more about 
async.waterfall where functions pass down values to the next function. 
*/ 

async.waterfall([ 
    callS3()//you can include more functions here, the callback from the last function will be available for the next. 
    //myNextFunction() 
],function(err,myData){ 
    //you can use myData here. 
}) 
+0

Я попытался использовать async, однако я не думаю, что я сделал это правильно. вот как я попробовал: [s3 с async] (http://pastebin.com/aGZLq4Xt) –

+0

Вы пытаетесь смешивать функции синхронизации с асинхронными функциями, и это не сработает, вам нужно избавиться от вашего возвращения и вместо этого получить это значение, используя обратные вызовы. Поэтому в итоге вы в основном замените return myData на callback (myData). Сейчас я сейчас ухожу, но позже я уточню свой ответ. Надеюсь, это даст вам некоторое представление о том, как решить вашу проблему. –

+0

@ManjurKhan Я обновил свой ответ с помощью образца кода. –

0

Это вопрос времени. Ниже приведен пример загрузки файла JSON из общего ресурса S3 при запуске сеанса.

function onLaunch(launchRequest, session, callback) { 
    var sBucket = "your-bucket-name"; 
    var sFile = "data.json"; 
    var params = {Bucket: sBucket, Key: sFile}; 
    var s3 = new AWS.S3(); 
    var s3file = s3.getObject(params) 

    new AWS.S3().getObject(params, function(err, data) { 
     if (!err) { 
      var json = JSON.parse(new Buffer(data.Body).toString("utf8")); 
      for(var i = 0; i < json.length; i++) { 
       console.log("name:" + json[i].name + ", age:" + json[i].age); 
      }     
      getWelcomeResponse(callback);     
     } else { 
      console.log(err.toString()); 
     } 
    });   
} 
Смежные вопросы