我正在尝试设置一种alexa技能,当遇到特定问题时调用MySQL查询。我尝试的所有操作似乎都没有效果,因为我遇到了错误或者什么也没有发生。
我正在使用/正在使用什么:
Alexa开发人员控制台
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();
},
};
我希望输出是“ OUTPUT:1”或“ OUTPUT:0”,但它是“ OUTPUT:”
对于输出,我指的是say变量。
最佳答案
SQL连接完成并调用responseBuilder...getResponse()
之前,函数将返回callback
。
我建议使用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技能。
关于mysql - 如何通过技能使Alexa运行MySQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57106921/