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

无法将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:08:04