无法将API参数传递至Lambda函数问题求助
解决API Gateway参数无法传递到Lambda的问题
看起来你遇到的核心问题是API Gateway传递给Lambda的event结构和你当前的解析方式不匹配。直接用querystring.parse(event)是不对的——Lambda收到的event不是原始的查询字符串,而是API Gateway封装后的完整请求对象。下面分几种常见场景给你针对性的解决方案:
1. 先确认API Gateway的集成模式
首先确保你的API Gateway用的是Lambda代理集成(这是最常用、配置最简便的方式)。如果是非代理集成,event结构会完全不同,建议优先切换到代理集成。
2. 根据请求类型修改Lambda代码
场景A:GET请求(参数在URL查询串中)
如果你的请求是类似GET /send-email?email=user@example.com的形式,Lambda的event.queryStringParameters字段会直接包含所有查询参数,不需要额外解析:
var aws = require('aws-sdk'); var ses = new aws.SES({ region: 'us-east-1' }); exports.handler = function(event, context) { // 直接从queryStringParameters中提取email参数 const email = event.queryStringParameters?.email; if (!email) { return context.fail('请求缺少email参数'); } console.log("收到的email参数: ", email); var eParams = { Destination: { ToAddresses: [email] }, Message: { Subject: { Data: '测试邮件' }, Body: { Text: { Data: '这是通过API Gateway+Lambda+SES发送的测试邮件' } } }, Source: '你的验证过的发件邮箱@example.com' // 必须是SES中已验证的邮箱 }; ses.sendEmail(eParams, function(err, data) { if (err) { console.error(err); context.fail(err.message); } else { console.log('邮件发送成功:', data); context.succeed('邮件已发送'); } }); };
场景B:POST请求(表单格式x-www-form-urlencoded)
如果你的请求是POST,参数通过表单提交(请求头Content-Type为application/x-www-form-urlencoded),那么参数会被放在event.body里,需要用querystring.parse解析这个body,而不是整个event:
var aws = require('aws-sdk'); var ses = new aws.SES({ region: 'us-east-1' }); const querystring = require('querystring'); exports.handler = function(event, context) { // 解析event.body而不是event本身 const output = querystring.parse(event.body); const email = output?.email; if (!email) { return context.fail('请求缺少email参数'); } console.log("收到的email参数: ", email); var eParams = { Destination: { ToAddresses: [email] }, Message: { Subject: { Data: '测试邮件' }, Body: { Text: { Data: '这是通过API Gateway+Lambda+SES发送的测试邮件' } } }, Source: '你的验证过的发件邮箱@example.com' }; ses.sendEmail(eParams, function(err, data) { if (err) { console.error(err); context.fail(err.message); } else { console.log('邮件发送成功:', data); context.succeed('邮件已发送'); } }); };
场景C:POST请求(JSON格式)
如果你的请求是POST,参数通过JSON传递(请求头Content-Type为application/json),直接解析event.body为JSON对象即可:
var aws = require('aws-sdk'); var ses = new aws.SES({ region: 'us-east-1' }); exports.handler = function(event, context) { // 解析JSON格式的请求体 const body = JSON.parse(event.body); const email = body?.email; if (!email) { return context.fail('请求缺少email参数'); } console.log("收到的email参数: ", email); var eParams = { Destination: { ToAddresses: [email] }, Message: { Subject: { Data: '测试邮件' }, Body: { Text: { Data: '这是通过API Gateway+Lambda+SES发送的测试邮件' } } }, Source: '你的验证过的发件邮箱@example.com' }; ses.sendEmail(eParams, function(err, data) { if (err) { console.error(err); context.fail(err.message); } else { console.log('邮件发送成功:', data); context.succeed('邮件已发送'); } }); };
3. 额外检查项
- 确保你的Lambda执行角色拥有
ses:SendEmail的权限,否则即使参数传递成功,SES也会返回权限错误。 - 发件邮箱必须在AWS SES中完成验证(或者你的账户已经移出沙箱),否则无法发送邮件到未验证的目标邮箱。
- 在API Gateway测试页面,可以查看请求日志,直接看到Lambda收到的event结构,能更快定位参数位置。
内容的提问来源于stack exchange,提问作者Ergun
相关产品推荐
相关产品推荐

