[英]Read from DynamoDB with Lambda nodejs for Alexa Skill
我是Skill和nodejs開發的新手,很快就遇到了我的第一個問題。
基本上,我試圖從DynamoDB讀取數據並讓它通過Alexa說話。
var title;
exports.handler = (event, context, callback) => {
getData();
alexa = Alexa.handler(event, context, callback);
alexa.appId = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};
const handlers = {
'LaunchRequest': function () {
this.emit('DoSomethingIntent');
},
'DoSomethingIntent': function () {
this.response.speak('Here are your data ' + title);
this.emit(':responseReady');
},
};
function getData() {
var ddb = new AWS.DynamoDB.DocumentClient({region:'eu-west-1'});
var params = {
TableName: 'data',
Key: {'data_id' : 1,},
};
ddb.get(params, function(err, data) {
if (err) {
}else{
title = data.Item.title;
}
});
}
問題是DynamoDB.DocumentClient.get函數是異步運行的,同時當DoSomethingIntent運行時,標題變量是未定義的。
解決這個問題的最佳做法是什么?
迄今為止唯一對我有用的解決方案是:
ddb.get(params, function(err, data) {
if (err) {
}else{
title = data.Item.title;
alexa.registerHandlers(handlers);
alexa.execute();
}
});
但它對我來說似乎不太實用!
您的工作解決方案是正確的,因為如果您編寫執行邏輯,那么它將在完成Dynamodb回調之前運行。 請記住DynamoDB調用是異步非阻塞I / O,因此它不會阻止任何代碼在回調之外執行。 因此,在回調中添加Alexa執行邏輯的更好位置。
發生這種情況是因為ddb.get()
函數是異步的,並且在執行處理程序后回調正在運行。 因此,在發送響應之前,不確定變量title
是否已填充。
你可以在這里使用原生承諾。
修改你的getData函數,如下所示:
function getData() {
var ddb = new AWS.DynamoDB.DocumentClient({region:'eu-west-1'});
var params = {
TableName: 'data',
Key: {'data_id' : 1,},
};
return new Promise((resolve,reject) => {
ddb.get(params, function(err, data) {
if (err) {
}else{
title = data.Item.title;
resolve(title);
}
});
})
}
並在處理程序函數和響應處理程序中執行以下更改:
exports.handler = (event, context, callback) => {
// Remove getData() from here
alexa = Alexa.handler(event, context, callback);
alexa.appId = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};
const handlers = {
'LaunchRequest': function () {
this.emit('DoSomethingIntent');
},
'DoSomethingIntent': function () {
getData()
.then( (title) => {
this.response.speak('Here are your data ' + title);
this.emit(':responseReady');
})
.catch( (error) => { // Handler error gracefully
console.log(error);
this.response.speak('Something is wrong. Try later.')
this.emit(':responseReady');
})
},
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.