Пользовательское умение Alexa с ask-dsk-v2 для Node.js. Сбой запроса Mysql на RDS, возврат пустой - PullRequest
0 голосов
/ 08 января 2020

Здравствуйте, я делаю "пользовательский навык - предоставьте свой собственный" ( не используется на основе alexa-hosted ), используя ask-dsk-v2 на node.js, и я хочу основать c запросить таблицу, которая находится в MySql в RDS. Функция Ламба и RDS находятся в ЕС-запад-1 (Ирландия). Лямбда и спроси у CLI используется Runtime Node.js 10.x.

Моя функция getPrimero () выполняется после завершения теста на консоли разработчика Alexa, , но при ssml возвращает пустое значение:"" (см. Ниже JSON Вывод 1).

ПРИМЕЧАНИЕ: Если выполняется одна функция getPrimero () на локальном node.js (на моем P C), запрос работает и возвращает данные таблицы Mysql на RDS (ниже):

MySql query on RDS Succees!, the result:  Ensalada de Bogavante

О конфигурации RDS:

  • Publi c Доступность: ДА
  • IAM Аутентификация БД: ОТКЛЮЧЕНО

О лямбде:

  • Виртуальное частное облако (VP C): НЕТ VP C
  • Триггер: Alexa Skill Kit (ассоциированный идентификатор alexa skill)

О разрешении IAM:

О проблеме, мои вопросы:

  • Разрешения IAM, конфигурация или код лямбда / RDS, что может не работать в настраиваемом навыке alexa?

  • Как можно легко протестировать запрос и соединение (чтобы обнаружить, что не получилось) для MySql в RDS?

  • Кто-нибудь успешно справился с запросом к Mysql в RDS с помощью nodejs и пользовательским навыком alexa и ask-sdk-v2 на nodejs?

Любая помощь приветствуется!

Заранее спасибо!

const Alexa = require('ask-sdk-core');
const i18n = require('i18next');
var config = require('./db_config.json');
var mysql = require('mysql');
const utf8 = require('utf8');
var Promise = require('promise');
var async = require("async");

const PrimerosIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'PrimerosIntent';
    },
    async handle(handlerInput) {
        var  speakOutput = await getPrimero();
        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt('¿Quieres saber algún plato más?')
            .withShouldEndSession(false)
            .getResponse();
    }
};


const ErrorHandler = {
    canHandle() {
        return true;
    },
    handle(handlerInput, error) {
        const speakOutput = "Perdona, no entiendo lo que dices. Por favor prueba de nuevo";
        console.log(`~~~~ Error handled: ${JSON.stringify(error)}`);

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};

Моя функция, чуть ниже приведенного выше кода "const PrimerosIntentHandler {..}":

function getPrimero(){
    var connection = mysql.createConnection({
        host            : config.dbhost,
        user            : config.dbuser,
        password        : config.dbpassword,
        database        : config.dbname
    });

    connection.connect(async function(err) {
        if (err) {
            console.error('error connecting: ' + err.stack); // show error, if happen
        return;
        }
        // if no error, to do the query:
        //console.log('connected as id ' + connection.threadId); // ONLY TEST
        var sqlQuery =  "SELECT nombre FROM r_menus WHERE site=342800010 AND es_un='Primeros'";
        var returnValue = "";
        returnValueFinal = "";
        connection.query(sqlQuery, function(error, rows) {
            if (error) {
                returnValue = "An error on connection.query";
            } else {
                returnValue = utf8.decode(rows[0]['nombre']); // also: rows[1]['nombre'] ; rows[2]['nombre']
                console.log("MySql query on RDS Success!, the result: " + returnValue);
                return (returnValue);
            }
        }); // .connection.query()
        connection.end();
    }); // .connection.connect() 
};

Alexa JSON Output 1 ("response ":, outputSpeech" :, "ssml": "" ") пусто:

{
    "body": {
        "version": "1.0",
        "response": {
            "outputSpeech": {
                "type": "SSML",
                "ssml": "<speak></speak>"
            },
            "reprompt": {
                "outputSpeech": {
                    "type": "SSML",
                    "ssml": "<speak>¿Quieres saber algun plato más?</speak>"
                }
            },
            "shouldEndSession": false,
            "type": "_DEFAULT_RESPONSE"
        },
        "sessionAttributes": {},
        "userAgent": "ask-node/2.7.0 Node/v10.17.0 sample/hello-world/v1.2"
    }
}

Вывод CloudWatch при выполнении функции Test на лямбду (выполняется мой код« ErrorHandler {..} »):

{
  "version": "1.0",
  "response": {
    "outputSpeech": {
      "type": "SSML",
      "ssml": "<speak>Perdona, no entiendo lo que dices. Por favor prueba de nuevo</speak>"
    },
    "reprompt": {
      "outputSpeech": {
        "type": "SSML",
        "ssml": "<speak>Perdona, no entiendo lo que dices. Por favor prueba de nuevo</speak>"
      }
    },
    "shouldEndSession": false
  },
  "userAgent": "ask-node/2.7.0 Node/v10.17.0 sample/hello-world/v1.2"
}

START RequestId: 21685e97-1537-4017-a8a7-734961bfbed1 Version: $LATEST
2020-01-08T13:46:34.556Z    21685e97-1537-4017-a8a7-734961bfbed1    INFO    ~~~~ Error handled: {}
END RequestId: 21685e97-1537-4017-a8a7-734961bfbed1
REPORT RequestId: 21685e97-1537-4017-a8a7-734961bfbed1  Duration: 25.47 ms  Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 88 MB  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...