AWS S3查询JSON文件返回null的Lambda代码问题求助
问题分析与解决方案
你的代码里主要问题是异步操作没有正确等待,加上一些小细节处理不到位,导致你看到返回null或者没拿到预期结果。咱们一步步来修正:
核心问题:异步Promise未等待
getS3Objects函数返回的是一个Promise对象,但你在handler里直接console.log(response)的时候,这个Promise还没完成(resolved/rejected),要么打印的是未解析的Promise实例,要么因为Lambda函数提前退出(没等异步操作结束),导致日志里没输出正确结果。
细节问题
ResponseContentType参数末尾多了个空格:'application/json ',这可能导致S3返回的响应头不符合预期,建议去掉空格。getObject返回的file.Body是Buffer类型,你需要把它转换成JSON对象才能拿到实际文件内容,而不是直接返回整个file对象。
修正后的代码
const aws = require('aws-sdk'); const s3 = new aws.S3(); const bucket = 'hotels.mserver.online'; const objectKey = 'hotelsrates.json'; // 改用async/await处理异步,更直观易维护 exports.handler = async (event, context) => { try { const s3Response = await getS3Objects(bucket, objectKey); // 把Buffer转换成JSON对象 const jsonContent = JSON.parse(s3Response.Body.toString()); console.log('获取到的JSON内容:', jsonContent); return jsonContent; // 如果需要把结果返回给调用方 } catch (error) { console.error('获取S3对象出错:', error); throw error; // 抛出错误让Lambda统一处理 } }; function getS3Objects(bucket, key) { return s3.getObject({ Bucket: bucket, Key: key, ResponseContentType: 'application/json' // 去掉末尾多余空格 }).promise(); }
额外说明
如果你的Lambda运行环境是Node.js 14+,非常推荐用async/await处理异步,比then/catch更清晰。要是你坚持用callback风格,得在异步回调里调用Lambda的callback,确保函数等待异步操作完成:
exports.handler = (event, context, callback) => { getS3Objects(bucket, objectKey) .then(file => { const jsonContent = JSON.parse(file.Body.toString()); console.log(jsonContent); callback(null, jsonContent); }) .catch(error => { console.error(error); callback(error); }); };
内容的提问来源于stack exchange,提问作者Soaad
相关产品推荐
相关产品推荐

