【问题标题】:How to make Alexa run MySQL Querys through a skill如何通过一个技巧让 Alexa 运行 MySQL 查询
【发布时间】:2019-11-28 02:55:05
【问题描述】:

我正在尝试设置一个 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 变量。

【问题讨论】:

    标签: mysql node.js amazon-web-services mysql-workbench alexa


    【解决方案1】:

    您的函数正在返回responseBuilder...getResponse() SQL 连接完成并调用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 技能。

    【讨论】:

    • 感谢您的回答!我知道我要求很多,但您能否使用我提供的代码向我展示 SQL 连接是如何工作的?我将研究 DynamoDB,但现在,当我设置好所有东西时,我仍然想用 MySQL 进行尝试,因为所有这些都只是为了测试目的。调整我的代码对我来说并不容易,因为使用 Alexa 的所有东西都使用处理程序常量而不是函数。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多