我正在尝试设置一个Alexa技能,当某个问题被问到时调用MySQL查询。我尝试的任何东西似乎都没有奏效,因为我要么出现错误,要么什么都没有发生。
我正在使用/我正在使用什么:
- 亚历克萨开发者控制台
- Cloud9 作为 IDE(将代码上传到 AWS Lambda,我在其中定义了代码中使用的环境变量(
- AWS Lambda, NodeJS
- Amazon RDS,托管我的数据库实例
- MySQL Workbench(我在其中创建了几个表来测试数据库,它工作正常(
尝试了几种方法来解决我的问题,例如创建连接或池,但我认为必须以不同的方式处理,因为 Alexa 必须等待响应。
const GetOeffnungszeiten_Handler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'GetOeffnungszeiten' ;
},
handle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
const responseBuilder = handlerInput.responseBuilder;
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
let say = 'OUTPUT: ';
var mysql = require('mysql');
var connection = mysql.createPool({
host : process.env.MYSQL_HOSTNAME,
user : process.env.MYSQL_USERNAME,
password : process.env.MYSQL_PASSWORD,
database : process.env.MYSQL_DATABASE,
port : process.env.MYSQL_PORT
});
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
pool.getConnection(function(err, connection) {
connection.query('select name from persons where id=1', function (error, results, fields) {
connection.release();
if (error) {
callback(error);
say=say+'0';
} else {
callback(null,results[0].name);
say=say+' 1';
}
});
});
};
return responseBuilder
.speak(say)
.reprompt('try again, ' + say)
.getResponse();
},
};
我希望输出是"输出:1"或"输出:0",但它是"输出:"对于输出,我指的是所述变量。
您的函数在 SQL 连接完成并调用callback
之前返回responseBuilder...getResponse()
。
我建议使用 async
和 await
重构您的代码,以使其更易于阅读和理解。(阅读 https://stormacq.com/2019/06/22/async-js.html 寻求帮助(
确保仅在对MySQL的调用返回时才返回Alexa响应,而不是在此之前。请记住,Alexa 超时为 8 秒,因此您的代码需要在此之前返回。 确保 AWS Lambda 超时也与 Alexa 超时保持一致(将其设置为 7 秒(
最后,我建议不要将MySQL用于Alexa技能。 由于每个 Lambda 调用可能由不同的容器提供服务,因此您的代码将为客户与您的技能之间的每次交互创建一个连接池,从而造成明显的延迟,以向客户做出响应。 DynamoDB 和 Elastic Cache 更适合 Alexa 技能。