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