簡體   English   中英

使用Lambda函數從S3存儲桶中檢索數據以鏈接到node.js中的alexa技能

[英]Retrieve data from S3 bucket with Lambda function link to an alexa skill in node.js

我在這里嘗試做的是在S3存儲桶中檢索基本的CSV文件,但是我很難獲取它。

我首先嘗試僅從基本lambda函數(未鏈接到alexa技能)中從存儲桶中獲取數據,如下所示:

console.log('Loading function');
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });

exports.handler = async (event, context) => {
    const bucket = 'mybucket';
    const key = 'myfile';
    const params = {
        Bucket: bucket,
        Key: key,
    };
    try {
        const data =  await s3.getObject(params).promise();
        var content = data.Body.toString();
        var lines = content.split('\r\n');
        var headers = lines[0].split(',');
        var result = {};
        for(var i=1;i<lines.length;i++){
            var currentline = lines[i].split(',');
            var obj2 = {};
            for(var j=2;j<headers.length;j++){
                obj2[headers[j]] = currentline[j];
            }
            result[currentline[0]+currentline[1]] = obj2;
        }
        return  result;
    } catch (err) {
        console.log(err);
        const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
        console.log(message);
        throw new Error(message);
    }
};

function : 它運行良好,但是后來我嘗試將其放入鏈接到我的alexa技能的lambda函數中,但沒有從函數接收任何信息:

const Alexa = require('alexa-sdk');
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
var data;

function getData(){

     // Setting the bucket and files parameters
    const bucket = 'mybucket';
    const key = 'myfile';
    const params = {
        Bucket: bucket,
        Key: key,
    };
    try {
        const data =  s3.getObject(params);

        // Getting the Body of the response 
        var content = data.Body.toString();

        // Splitting into a proper data structure
        var result = {};
        var lines = content.split("\r\n");
        var headers = lines[0].replace('\r','').split(",");

        for(var i=1;i<lines.length;i++){
              var currentline = lines[i].split(",");
              var obj2 = {};
              for(var j=2;j<headers.length;j++){
                  obj2[headers[j]] = currentline[j];
              }
              result[currentline[0].toLowerCase()+currentline[1].toLowerCase()] = obj2;
         }


    } catch (err) {
        console.log(err);
        const message = `Error getting object ${key} from bucket ${bucket}.`;
        console.log(message);
        throw new Error(message);
    }

    // Sending the response back
    return result;

}


const handlers = {
    'LaunchRequest': function () {

        // GETTING THE DATA SET

        data = getData();


        // Stuff here
        this.emit(':responseReady');
    },
    'getLocalisation': function () {
        //Stuff here
    },
    'AMAZON.HelpIntent': function () {
        this.response.speak(messages.HELP);
        this.emit(':responseReady');
    },
    'AMAZON.CancelIntent': function () {
        this.response.speak(messages.STOP);
        this.emit(':responseReady');
    },
    'AMAZON.StopIntent': function () {
        this.emit(':tell', 'Bye');
    },
    'AMAZON.FallbackIntent': function () {
        this.response.speak(messages.ERROR);
        this.emit(':responseReady');
    },
};

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

    const alexa = Alexa.handler(event, context, callback);
    alexa.APP_ID = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

我直接從AWS Lambda IDE運行所有內容。 我認為我在Async / Await / Promise方面缺少一些東西,但我並沒有真正理解它。

我只需要放

async function getData()

exports.handler = async (event, context, callback) => {
    // code here
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM