我正在尝试设置一种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

我建议使用asyncawait重构代码,使其更易于阅读和理解。 (阅读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/

10-16 11:51