Запись данных в DynamoDB с помощью лямбды в навыке Alexa - PullRequest
0 голосов
/ 06 марта 2019

У меня есть лямбда-функция, которая связана с навыком Alexa. В начале навыка я хочу сохранить строку в 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');
            }
        });
};   

1 Ответ

0 голосов
/ 07 марта 2019

this.emit только что заканчивает выполнение лямбды, и функция putItem не может быть завершена в своей области.Вы должны позвонить this.emit, когда putItem завершится.

Этого можно добиться с помощью 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, который вы хотите использовать, больше не поддерживается.Я бы порекомендовал перейти на последнюю версию (переписав код или используя адаптер )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...