在 Alexa 技能中使用 lambda 将数据写入 dynamoDB

Writing data to dynamoDB with lambda in an Alexa skill

我有一个连接到 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');
            }
        });
};   

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, that you want to use is no longer supported. I would recommend to switch to the latest version (by re-writing the code or by using an adapter)