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

Node.js异步函数返回空数组问题:控制器与模型结果不一致

问题根源

你遇到的问题是异步操作未等待完成就返回结果:
pollOptions.rows.map(async value => { ... }) 中的async函数会返回Promise,但map本身不会等待这些Promise执行完毕。你的代码直接返回了空的result数组,而result.push(data)是在后续异步操作完成后才执行的,这就导致控制器拿到的是提前返回的空数组,而模型里的console.log会在异步完成后打印出正确数据。

修复方案

有两种常用的修复方式:

方式1:用for...of循环替代map

for...of可以等待每个异步操作完成后再执行下一次循环,确保result数组被正确填充:

const getPollOptionsByPollId = async (poll_id) => 
{
    var querySql1 = "SELECT * FROM public.group_poll_options 

                     WHERE option_poll_id= $1 AND 

                    option_status = $2 ORDER BY option_id";

    var queryParams1 = [poll_id, "active"];
    var pollOptions = await db.query(querySql1, queryParams1);
    var result = [];
    if (pollOptions.rowCount != 0) {
        // 用for...of等待每个异步操作完成
        for (const value of pollOptions.rows) {
            var voteCount = await totalvotesbypolloption(poll_id, value.option_id);
            console.log("voteCount",voteCount);
            var data = {
                option_id: value.option_id,
                option_poll_id: value.option_poll_id,
                option_value: value.option_value,
                option_status: value.option_status,
                option_created_at: value.option_created_at,
                option_votes: voteCount
            }

            result.push(data);
        }
    }
    return result;
}

方式2:用Promise.all处理Promise数组

收集map返回的所有Promise,用Promise.all等待全部执行完成后再返回结果:

const getPollOptionsByPollId = async (poll_id) => 
{
    var querySql1 = "SELECT * FROM public.group_poll_options 

                     WHERE option_poll_id= $1 AND 

                    option_status = $2 ORDER BY option_id";

    var queryParams1 = [poll_id, "active"];
    var pollOptions = await db.query(querySql1, queryParams1);
    
    if (pollOptions.rowCount === 0) {
        return [];
    }
    
    // 等待所有异步操作完成后生成结果数组
    const result = await Promise.all(pollOptions.rows.map(async value => {
        var voteCount = await totalvotesbypolloption(poll_id, value.option_id);
        console.log("voteCount",voteCount);
        return {
            option_id: value.option_id,
            option_poll_id: value.option_poll_id,
            option_value: value.option_value,
            option_status: value.option_status,
            option_created_at: value.option_created_at,
            option_votes: voteCount
        }
    }));
    
    return result;
}

内容的提问来源于stack exchange,提问作者pankaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:45:32