如何从AWS Lambda返回HTTP响应(搭配HTTP API Gateway)
解决方案:Lambda + HTTP API Gateway 正确返回响应
你的问题出在直接返回SES的Promise结果——API Gateway的HTTP集成要求Lambda返回特定格式的响应对象,而不是SES调用的原始返回值。下面是修改后的代码,实现成功返回提示、错误返回信息的需求:
const aws = require("aws-sdk"); const ses = new aws.SES(); exports.handler = async function (event) { try { // 解析请求体,同时处理解析失败的情况 let requestBody; try { requestBody = JSON.parse(event.body); } catch (parseErr) { return { statusCode: 400, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ error: "请求格式错误,无法解析JSON" }) }; } const { name, email, phone, message } = requestBody; // 验证必填字段,避免空值导致邮件发送失败 if (!name || !email || !message) { return { statusCode: 400, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ error: "姓名、邮箱、留言为必填项" }) }; } const params = { Destination: { ToAddresses: ["你的接收邮箱"], }, Message: { Body: { Text: { Data: `Hello from Lambda! 你收到了来自${name}的消息。\n联系方式:\n - 邮箱:${email}\n - 电话:${phone}\n留言内容:${message}` }, }, Subject: { Data: `来自${name}的咨询` }, }, Source: "你的发件邮箱", }; // 执行邮件发送 await ses.sendEmail(params).promise(); // 发送成功,返回200响应 return { statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ success: true, message: "邮件发送成功,我们会尽快回复你" }) }; } catch (err) { // 捕获所有错误,返回500或对应错误信息 console.error("邮件发送失败:", err); return { statusCode: 500, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ error: "邮件发送失败,请稍后重试", details: err.message }) }; } };
关键修改说明:
- 响应格式标准化:所有返回结果都遵循API Gateway要求的结构,包含
statusCode(HTTP状态码)、headers(指定返回JSON格式)、body(JSON字符串化的内容)。 - 错误分层处理:
- 先捕获JSON解析错误,返回400请求错误
- 验证必填字段,提前拦截无效请求
- 捕获SES发送过程中的异常,返回500服务器错误并记录日志
- 简化函数参数:async函数模式下不需要
context和callback参数,直接用return返回响应即可。
这样修改后,前端表单就能收到清晰的成功/错误提示,不会再触发500服务器错误。
内容的提问来源于stack exchange,提问作者Benny
相关产品推荐
相关产品推荐

