将查询结果保存到变量 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。
我需要一个用于 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。