【问题标题】:Writing data to dynamoDB with lambda in an Alexa skill在 Alexa 技能中使用 lambda 将数据写入 dynamoDB
【发布时间】:2019-07-28 13:41:09
【问题描述】:

我有一个连接到 Alexa 技能的 lambda 函数。在技​​能开始时,我想将字符串存储到 dynamoDB。因此,我直接在启动请求中调用了一个函数(该函数称为 nameExport())。 但是,如果我在启动请求中删除“this.emit”命令,该功能只会存储一些东西。如果我离开“this.emit”,则该技能正在工作,但没有任何内容存储到数据库中。您可以在下面找到有关 LaunchRequest 的代码以及存储到 dynamoDB 中的函数。

var config = require("config");
var Alexa = require("alexa-sdk");
var AWS = require("aws-sdk");
var Speech = require("ssml-builder");
var dynamodb = new AWS.DynamoDB();

let handlers = {
    'LaunchRequest': function () {
        nameExport("testName");
        let speech = new Speech ();
        speech.say("Welcome by Emotions.")
        speech.pause("100ms")
        speech.say("Do you want to assess your current emotion?")
        let speechOutput = speech.ssml(true);
        this.emit(":ask", speechOutput)
    },
    'Emotion': function () {
        let speech = new Speech();
        ...

应该将字符串写入数据库的 nameExport 函数:

function nameExport(name) {
    var tableName = "myinfo";
    dynamodb.putItem({
            "TableName": tableName,
            "Item": {
                "name": {
                    "S": name
                }
            }
        }, function(err, data) {
            if (err) {
                //context.fail('ERROR: Dynamo failed: ' + err);
            } else {
                console.log('Dynamo Success: ' + JSON.stringify(data, null, '  '));
                //context.succeed('SUCCESS');
            }
        });
};   

【问题讨论】:

    标签: node.js aws-lambda amazon-dynamodb alexa


    【解决方案1】:

    this.emit 刚刚完成 lambda 执行,putItem 函数无法在其范围内完成。当putItem 结束时,您应该调用this.emit

    您可以通过使用 async/await 来实现这一点(确保 lambda 使用 node.js v8.10):

    'LaunchRequest': async function () {
            await nameExport("testName");
            let speech = new Speech ();
            speech.say("Welcome by Emotions.")
            speech.pause("100ms")
            speech.say("Do you want to assess your current emotion?")
            let speechOutput = speech.ssml(true);
            this.emit(":ask", speechOutput)
        },
    
    
    async function nameExport(name) {
        var tableName = "myinfo";
        return new Promise((resolve, reject) => { dynamodb.putItem({
                "TableName": tableName,
                "Item": {
                    "name": {
                        "S": name
                    }
                }
            }, function(err, data) {
                if (err) {
                    reject(err);
                } else {
                    console.log('Dynamo Success: ' + JSON.stringify(data, null, '  '));
                    resolve();
                }
            })});
    };  
    

    或者没有async/await,通过在回调中发出“:ask”,这不是那么温和的解决方案:

    'LaunchRequest': function () {
    
            let speech = new Speech ();
            speech.say("Welcome by Emotions.")
            speech.pause("100ms")
            speech.say("Do you want to assess your current emotion?")
            let speechOutput = speech.ssml(true);
            nameExport("testName", () => this.emit(":ask", speechOutput));
        },
    
    
    function nameExport(name, callback) {
        var tableName = "myinfo";
        return new Promise((resolve, reject) => { dynamodb.putItem({
                "TableName": tableName,
                "Item": {
                    "name": {
                        "S": name
                    }
                }
            }, function(err, data) {
                if (err) {
                    // some error handling
                } else {
                    callback()
                }
            })});
    };  
    

    顺便说一句 - 有一个 Alexa SDK 2.0 - 1.0,不再支持您要使用的。我建议切换到最新版本(通过重写代码或使用adapter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-11
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多