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

AWS S3查询JSON文件返回null的Lambda代码问题求助

问题分析与解决方案

你的代码里主要问题是异步操作没有正确等待,加上一些小细节处理不到位,导致你看到返回null或者没拿到预期结果。咱们一步步来修正:

核心问题:异步Promise未等待

getS3Objects函数返回的是一个Promise对象,但你在handler里直接console.log(response)的时候,这个Promise还没完成(resolved/rejected),要么打印的是未解析的Promise实例,要么因为Lambda函数提前退出(没等异步操作结束),导致日志里没输出正确结果。

细节问题

  1. ResponseContentType参数末尾多了个空格:'application/json ',这可能导致S3返回的响应头不符合预期,建议去掉空格。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:21:16