Alexa技能:MySQL查询结果存变量显示[Object Object]求助
解决Alexa Skill中MySQL查询返回[Object Object]的问题
嘿,我一眼就看出问题出在哪了——你踩了异步操作的坑!咱们一步步拆解和修复:
问题根源
connection.query()是异步方法,它的返回值并不是查询结果,而是一个Query对象(也就是你看到的[Object Object])。你现在的代码直接把这个对象赋值给stat,然后立刻返回响应,这时候查询甚至还没执行完呢!- 你提前调用了
connection.end(),这会在查询完成前就断开数据库连接,大概率会导致查询失败。
修复方案
我们需要把异步的数据库查询用Promise封装,然后用async/await来等待结果,这样就能确保拿到真实的查询结果再构建Alexa的响应。
修改后的完整代码如下:
canHandle(handlerInput) { return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest' && Alexa.getIntentName(handlerInput.requestEnvelope) === 'buscaIntent'; }, async handle(handlerInput) { // 改成async函数 const mysql = require('mysql'); const connection = mysql.createConnection ({ host: 'remotemysql.com', user: 'RBb34534sd', password: 'xxxxxxxxx', database: 'RBsdfewrg' }); // 用Promise封装query操作,方便await const queryPromise = new Promise((resolve, reject) => { connection.query( 'SELECT `spe` FROM `prueba` WHERE `nombre` LIKE "raichu" limit 1', (err, result, fields) => { if (err) { reject(err); // 出错时拒绝Promise } else { resolve(result); // 成功时返回结果 } } ); }); try { const result = await queryPromise; // 等待查询完成拿到结果 const stat = result[0]?.spe; // 取出spe字段,可选链避免空值报错 connection.end(); // 查询完成后再关闭连接 return handlerInput.responseBuilder .speak("Busc " + (stat || "未找到相关数据")) // 处理可能的空值 .reprompt("reprompt buscar") .getResponse(); } catch (err) { connection.end(); // 出错也要关闭连接 console.error(err); return handlerInput.responseBuilder .speak("查询时出现错误,请稍后再试") .getResponse(); } }
关键改进点
- 将
handle声明为async函数,这样就能在内部使用await等待异步操作完成 - 把
connection.query包装成Promise,让异步操作可以被await - 等待查询结果返回后,才提取
spe字段、关闭连接并构建响应 - 增加了错误处理,避免查询出错时Skill崩溃
- 用
result[0]?.spe的可选链语法,防止查询结果为空时出现Cannot read property 'spe' of undefined的错误
这样修改后,你就能拿到真实的spe字段值,而不是那个[Object Object]的Query对象啦!
内容的提问来源于stack exchange,提问作者P R R S
相关产品推荐
相关产品推荐

