如何使用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
相关产品推荐
相关产品推荐

