将查询结果保存到变量 Alexa 技能 Json

Save Query result into Variable Alexa Skills Json

我需要一个用于 alexa 应用程序的数据库,所以我设置并很好地插入,但是当我尝试 SELECT 并将其保存到变量时,保存到变量的值是 [Object Object ] 而不是想要的值,我知道它可能是异步问题或解析问题,但我无法修复代码,一些帮助会很酷,

    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'buscaIntent';
    },
    handle(handlerInput) {

            const mysql = require('mysql');
            const connection = mysql.createConnection
            ({
            host: 'remotemysql.com',
            user: 'RBb34534sd',
            password: 'xxxxxxxxx',
            database: 'RBsdfewrg'
            });


            var stat = connection.query('SELECT `spe` FROM `prueba` WHERE `nombre` LIKE "raichu" limit 1', function (err, result, fields) {
                if (err) throw err;
                console.log(result);
                return result[0];
              });
            connection.end();

            return handlerInput.responseBuilder

            .speak("Busc " + stat)
            .reprompt("reprompt buscar")
            .getResponse();


    }
}; ```

我认为查询正在返回一个对象,您不能在语音中保留该对象。检查对象内部的内容,如果您在该对象中有想要的字段,则通过 stat.YourField.

访问

问题是您在将响应发送到 Alexa 服务之前没有等待数据库查询完成。 node.js 中的请求是非阻塞的,这意味着您需要使用回调嵌套请求,或者利用 Promises / async-await 模式,以便在函数完全执行之前处理 SQL 查询。

您可以阅读更多关于转换 SQL 连接的内置库以支持已经有包装器的 Promises here, or use a library like this

在任何一种情况下,最终结果都将重构为如下所示:

canHandle(handlerInput) {
    return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
        && Alexa.getIntentName(handlerInput.requestEnvelope) === 'buscaIntent';
},
async handle(handlerInput) {
        const mysql = require('mysql2/promise');
        const connection = await mysql.createConnection
        ({
        host: 'remotemysql.com',
        user: 'RBb34534sd',
        password: 'xxxxxxxxx',
        database: 'RBsdfewrg'
        });

        var stat = await connection.execute('SELECT `spe` FROM `prueba` WHERE `nombre` LIKE "raichu" limit 1', function (err, result, fields) {
            if (err) throw err;
            console.log(result);
            return result[0];
          });

        return handlerInput.responseBuilder
        .speak("Busc " + stat)
        .reprompt("reprompt buscar")
        .getResponse();
}

另一篇描述 Alexa 请求的异步调用的文章here