使用AWS SES、Lambda、Gateway时遇JSON解析错误求助
解决Lambda中JSON.parse(event.body)的"Unexpected token o"错误
错误原因分析
你遇到的SyntaxError: Unexpected token o in JSON at position 1,本质是event.body已经是解析完成的JavaScript对象,不需要再调用JSON.parse()。当你对对象执行JSON.parse时,JS会先把对象转为字符串"[object Object]",解析这个字符串时,位置1的字符是o,不符合JSON语法,因此触发错误。
查看你代码里的console.log('EVENT: ', event)输出,应该能看到event.body直接是一个包含senderEmail、senderName、message的对象,而非JSON字符串。
解决方案
1. 移除多余的JSON.parse
将代码中这一行:
const { senderEmail, senderName, message } = JSON.parse(event.body)
修改为:
const { senderEmail, senderName, message } = event.body
2. 优化响应格式(满足你返回详细响应的需求)
原代码直接返回SES的Promise,返回格式可能不符合API Gateway的要求,建议用try/catch捕获异常,并返回结构化的响应:
修改后的完整代码:
const aws = require("aws-sdk"); const ses = new aws.SES({ region: "us-east-1" }); exports.handler = async function (event) { console.log('EVENT: ', event) // 直接解构已解析的event.body对象 const { senderEmail, senderName, message } = event.body; const params = { Destination: { ToAddresses: ["your@email.com"], }, Message: { Body: { Text: { Data: `You just got a message from ${senderName} - ${senderEmail}: ${message}` }, }, Subject: { Data: `Message from ${senderName}` }, }, Source: "your@email.com", }; try { const sesResult = await ses.sendEmail(params).promise(); // 返回成功响应,包含详细信息 return { statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ success: true, msg: "邮件发送成功", sesResponse: sesResult }) }; } catch (err) { // 返回错误响应,包含具体错误信息 return { statusCode: 500, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ success: false, msg: "邮件发送失败", error: err.message }) }; } };
关键修改说明
- 去掉不必要的
JSON.parse,直接使用已解析的event.body对象 - 用
try/catch捕获SES调用的异常,避免Lambda因未处理错误直接崩溃 - 返回符合API Gateway规范的响应结构,包含状态码、Content-Type头部和可读的详细信息,方便前端处理
内容的提问来源于stack exchange,提问作者joemamah24
相关产品推荐
相关产品推荐

