async函数调用MySQL SELECT返回[object Promise]但控制台输出正常怎么解决
问题修复方案
问题核心原因
你遇到的问题是典型的异步调用逻辑错误,两个错误点共同导致了该问题:
- 你写的
getlastweek使用了回调式的MySQL查询语法,回调函数内部的return无法传递给外层函数作为返回值,加上async函数没有显式返回正常值,默认会返回一个pending状态的Promise对象,直接拼接字符串就会显示[object Promise]。控制台能正常打印是因为打印逻辑写在回调内部,等数据库返回结果后才执行,自然能拿到值。 - 就算异步函数逻辑正确,调用异步函数时也必须加
await关键字,才能拿到Promise执行完成后的实际返回值。
修复步骤
第一步:改造getlastweek函数,将回调式查询转为Promise式
如果你用的是官方mysql模块,可以用Node内置的util.promisify工具包装query方法:
const { promisify } = require('util'); // 绑定connection上下文,把回调式query转为支持async/await的promise方法 const query = promisify(connection.query).bind(connection); async function getlastweek(){ try { const results = await query('SELECT weekstartdate FROM schedule ORDER BY weekstartdate DESC LIMIT 1'); const dateStr = String(results[0].weekstartdate).slice(0, 10); console.log(dateStr); return dateStr; } catch (err) { console.log('查询周数据失败', err); // 可以按需返回默认值或者抛出错误 return ''; } }
如果你已经在使用mysql2模块,直接用它自带的promise接口即可,不需要额外包装。
第二步:调用异步函数时加await关键字
修改业务逻辑代码,调用getlastweek前加await获取实际返回值:
bot.hear(/^Добавить новую неделю$/, async (msg)=>{ if(msg.messagePayload){ if(msg.messagePayload.command === 'add week'){ // 加await获取异步查询的实际返回结果 const lastWeekDate = await getlastweek(); vk.api.messages.send({ peer_id: msg.peerId, random_id: (Math.random() * (9999999 - 1) + 1), message: 'Последняя неделя была ' + lastWeekDate + '\nСегодня ' + now }) }else{msg.send('Команду вызывать надо через админку')} }else{msg.send('Нее, эт так работать не будет')} })
内容的提问来源于stack exchange,提问作者GeneriumMadness
相关产品推荐
相关产品推荐

