使用带有Alexa的nodejs查询dynamodb以返回多个项目

时间:2018-01-11 16:59:39

标签: node.js aws-lambda alexa alexa-skills-kit

我对这一切都是新手,所以请提前道歉。我试图使用nodejs和lambda查询Dynamodb,这样我就可以让Alexa返回值。 dynamodb表的设置类似于:

date          time      filmname
2018-01-04    13:00     Titanic
2018-01-04    15:30     Titanic
2018-01-04    18:30     Paddingtion 
2018-01-05    12:00     Star Wars

我的表格设置为: 主分区键=日期(字符串) 主要排序键=时间(字符串)

现在我要做的是查询或从特定日期获取Dynamodb的信息,因此对于2018-01-04应该返回3个项目。这是否可以使用Lambda中的nodejs并允许alexa读回所有项目?

我已经在我的意图中设置了以下代码,这很好用:

var params = {
    TableName: 'Cinema',
    Key:{ "date": "2018-01-04", "time" : "13:00"  }
    };

docClient.get(params, (err, data) => {
    if (err) {
        this.emit(':tell', 'Test Error');
    } else {
        this.emit(':tell', 'Test Working ' + data.Item.title);
    }
});

上面的代码按预期返回泰坦尼克号。但是,我被困在如何让它返回给定日期的所有项目而不仅仅是在特定时间。

我能够独立运行这个js代码(即不在lambda中),这样可以正常工作。虽然我怀疑这不是最好的方法。

 var params = {
            TableName: 'Cinema',
            KeyConditionExpression: "#date = :yymmdd and #time between :time1 and :time2",
            ExpressionAttributeNames:{
            "#date": "date",
        "#time": "time"

            },
            ExpressionAttributeValues: {
            ":yymmdd":"2018-01-04",
        ":time1":'0',
        ":time2":'2'
    }
};


docClient.query(params, function(err, data) {
    if (err) {
        console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    } else {
        console.log("Query succeeded.");
        data.Items.forEach(function(item) {
            console.log(" -", item.title + ": ");
        });
    }
});

现在,如果我在Lambda中运行此代码并尝试测试我得到的技能,则无法调用远程端点,或者它返回的响应无效。'另外,由于某些原因,我的cloudwatch日志没有针对该特定lambda函数进行更新,因此我目前无法获得有关它的更多信息。

1 个答案:

答案 0 :(得分:1)

如果有人有兴趣,我解决了这个问题。这很简单,只需确保发送给Alexa的响应只触发一次。

我是新手,所以虽然代码按要求运作,但我愿意接受有关最佳实践的任何建议。

function queryDynamoDate_single() {
const startdate = this.attributes['startdate'];


 var say = '';

var params = {
        TableName: 'Cinema',
        KeyConditionExpression: "#date = :yymmdd and #time between :time1 and :time2",
        ExpressionAttributeNames:{
        "#date": "date",
    "#time": "time"

        },
        ExpressionAttributeValues: {
        ":yymmdd":startdate,
    ":time1":'0',
    ":time2":'2'
    }
};

  readDynamoItem(params, myResult=>{
        say = myResult;
        say = 'you asked,. The answer is: ' + myResult;

        this.response.speak(say).listen('try again');
        this.emit(':responseReady');

    });         
}

function readDynamoItem(params, callback) {
var title = [];
var time = [];
var noofitems = 0;
let speechOutput = "";

    docClient.query(params, (err, data) => {
        if (err) {
            this.emit(':tell', 'Test Error');
        } else {
            console.log("Query succeeded.");
            data.Items.forEach(function(item) {
                console.log(" -", item.title + ": ");
                noofitems = noofitems + 1;
                title[noofitems] = item.title;
                time[noofitems] = item.time;
    });

     for (var l = 1; l <= noofitems ; l++){
     {
            speechOutput = speechOutput + title[l]; 
     }

callback(speechOutput);
        }
    });

}