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

如何使用AWS Lambda Node.js 18.x运行时读取S3中的JSON文件?

S3读取JSON文件问题:Node.js 18.x + AWS SDK v3适配方案

已确认的解决方案

  • 根本原因并非Node.js运行时版本问题,而是AWS SDK v3与v2的使用逻辑差异
  • 核心提示:不要同时更新运行时和SDK版本,避免双重适配带来的问题🥲

问题背景

此前基于Node.js 14.x运行时的Lambda函数可正常从S3读取JSON文件,代码如下:

const AWS = require("aws-sdk");
const s3 = new AWS.S3();

exports.handler = (event) => {
    const { bucketName, objKey } = event
    const params = {
        Bucket: bucketName, 
        Key: objKey
    };
    return new Promise((resolve) => {
        s3.getObject(params, async (err, data) =>{
            if (err) console.log(err, err.stack); 
            else     {
                const contents = JSON.parse(data.Body)
                resolve(contents);
            }
        });
    })
};

该代码可稳定返回预期JSON数据,但切换到Node.js 18.x运行时后,新编写的Lambda函数出现多种异常,具体场景如下:

补充说明:

  • 新旧Lambda读取的是同一个S3 JSON文件
  • 尝试过data.Body.toString(),但在当前场景中无效

场景A(返回null)

import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
const s3Client = new S3Client({ region: "ap-northeast-2" });

export const handler = (event) => {
    const { objKey, bucketName } = event;
    const params={
        Bucket: bucketName, 
        Key: objKey
    };
    
    const getObjCommand = new GetObjectCommand(params);
    
    return new Promise((resolve) => {
        s3Client.send(getObjCommand, async (err, data) =>{
            if (err) console.log(err, err.stack); 
            else     {
                const list = JSON.parse(data.Body)
                resolve(list);
            }
        });
    })
};

场景B(报错:"Unexpected token o in JSON at position 1")

export const handler = async (event) => {
    const { objKey, bucketName } = event;
    const params={
        Bucket: bucketName, 
        Key: objKey
    };
    
    const getObjCommand = new GetObjectCommand(params);
    const response = await s3Client.send(getObjCommand)
    
    console.log("JSON.parse(response.Body)", JSON.parse(response.Body))
};

场景C(报错:"TypeError: Converting circular structure to JSON")

export const handler = async (event) => {
    const { objKey, bucketName } = event;
    const params={
        Bucket: bucketName, 
        Key: objKey
    };
    const getObjCommand = new GetObjectCommand(params);
    
    try {
        const response = await s3Client.send(getObjCommand)
        return JSON.stringify(response.Body)
    } catch(err) {
        console.log("error", err)
        return err
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:20:25