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
相关产品推荐
相关产品推荐

