以下代码是我的Alexa技能中的启动处理程序,并且在处理程序内部有一个名为x的变量。我试图将x设置为从dynamoDB获取的数据,并在get函数(我从https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html#GettingStarted.NodeJs.03.02获得函数)之外使用它,以便Alexa可以说出x的值(字符串)(如您在返回中看到的)。我的“ get”函数中的语句未在get函数本身之外更改x的值。我知道get函数内部的x实际上已被更改,因为我正在将它记录到控制台。因此,我对此发表了类似的帖子,最初我认为这是一个范围问题,但事实证明这是因为get函数是异步的。因此,我添加了async和await关键字,如下所示。根据我的研究,我是NodeJS的新手,所以我认为应该把它们放在那里。但是,这仍然无法正常工作。
const LaunchHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === `LaunchRequest`;
},
async handle(handlerInput) {
var x;
//DYNAMO GET FUNCTION
await DBClient.get(params, function(err, data) {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
} else {
x = data.Item.Answer;
} });
return handlerInput.responseBuilder
.speak(x)
.withShouldEndSession(false)
.getResponse();
},
};
作为旁注,这是我(成功地)从数据库返回的JSON:
{
"Item": {
"Answer": "Sunny weather",
"Question": "What is the weather like today"
}
}
答案 0 :(得分:0)
您是否正在寻找类似的东西?在handle函数中,我调用另一个函数getSpeechOutput来创建一些反馈文本。因此该函数调用dynamodb函数getGA来获取用户数据
const getSpeechOutput = async function (version) {
const gadata = await ga.getGA(gaQueryUsers, 'ga:users')
let speechOutput;
...
return ...
}
const UsersIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'UsersIntent';
},
async handle(handlerInput) {
try {
let speechOutput
...
speechOutput = await getSpeechOutput("long");
...
return handlerInput.responseBuilder
.speak(speechOutput)
.reprompt("Noch eine Frage?")
.withSimpleCard(defaulttext.SKILL_NAME, speechOutput)
.getResponse();
} catch (error) {
console.error(error);
}
},
};
那是db函数:
const getUser = async function (userId) {
const dynamodbParams = {
TableName: process.env.DYNAMODB_TABLE_BLICKANALYTICS,
Key: {
id: userId
}
}
return await dynamoDb.get(dynamodbParams).promise()
}