簡體   English   中英

使用Lambda以Alexa技能將數據寫入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();
        ...

應該將String寫入數據庫的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 我建議切換到最新版本(通過重寫代碼或使用適配器

暫無
暫無

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

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