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

async封装的S3 listObjects工具函数await调用返回undefined如何解决

问题原因

你使用的AWS SDK v2中,回调形式的s3.listObjects方法不会返回Promise,你在前面加的await没有实际效果,函数会在回调函数执行前就提前返回了还没被赋值的fileKeys变量,所以才会出现先打印keys undefined、后打印回调内key1数组的执行顺序问题。

解决方案

最简单的修改方式是直接调用AWS SDK内置的.promise()方法,将回调式API转为Promise形式,就可以正常用await接收返回结果:

const listFileKeysInSpaceByPrefix = async (prefix) => {
    const params = {
        Bucket: process.env.S3_BUCKET_NAME,
        Prefix: prefix,
    };
    try {
        const data = await s3.listObjects(params).promise();
        const fileKeys = data.Contents.map(obj => obj.Key);
        console.log("key1", fileKeys);
        return fileKeys;
    } catch (err) {
        console.log(err, err.stack);
        next(err);
        // 可根据业务需要选择抛出错误或返回空数组
        return [];
    }
};

你也可以手动封装Promise实现相同效果:

const listFileKeysInSpaceByPrefix = (prefix) => {
    return new Promise((resolve, reject) => {
        const params = {
            Bucket: process.env.S3_BUCKET_NAME,
            Prefix: prefix,
        };
        s3.listObjects(params, function (err, data) {
            if (err) {
                console.log(err, err.stack);
                next(err);
                return reject(err);
            }
            const keys = data.Contents.map(obj => obj.Key);
            console.log("key1", keys);
            resolve(keys);
        });
    })
};

修改完成后你原有的调用代码无需改动,await就可以正常获取到返回的key数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:48:01