You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:42:02