我正在try 通过AWS REST API Gateway将"Body":"Test"和"Subject":"Test"发送到Lambda函数,该函数将使用它发送一封使用AWS SES的邮箱.

var aws = require('aws-sdk');
var ses = new aws.SES({ region: 'eu-west-2' });
exports.handler = (event) => {
    sendMail(event);
};

async function sendMail(event) {
    const emailParams = {
        Destination: {
            ToAddresses: ["**EMAIL**"],
        },
        Message: {
            Body: {
                Text: { Data: event.body },
            },
            Subject: { Data: event.subject },
        },
        Source: "**ANOTHEREMAIL**",
    };

    try {
        let response = await ses.sendEmail(emailParams).promise();
        console.log("MAIL SENT SUCCESSFULLY!!");
        console.log("subject:", event.subject);
        console.log("body:", event.body);
        console.log(JSON.stringify(event));
        return response;
    } catch (e) {
        console.log("FAILURE IN SENDING MAIL!!", e);
        console.log("subject:", event.subject);
        console.log("body:", event.body);
        console.log(JSON.stringify(event));
    }
    return;
}

在使用AWS中的lambda测试事件函数时,使用json可以很好地执行上述操作:

{
  "subject": "Testing",
  "body": "Testing"
}

然而,当我try 使用postman 发布相同的json时,我得到:

subject: undefined
body: { "subject":"Testing", "body":"Testing" }

我可以看到通过AWS内置测试仪传递的数据格式为:

 {"subject":"New Test","body":"New test body"}

然而,对于postman 来说,它是:

{
    "resource": "/contact",
    "path": "/contact",
    "httpMethod": "POST",
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate, br",
        "Content-Type": "application/json",
        "Host": "REDACTED",
        "Postman-Token": "REDACTED",
        "User-Agent": "PostmanRuntime/7.32.3",
        "X-Amzn-Trace-Id": "Root=1-64d629d1-6991407c4ca2e1125b6d1858",
        "X-Forwarded-For": "REDACTED",
        "X-Forwarded-Port": "443",
        "X-Forwarded-Proto": "https"
    },
    "multiValueHeaders": {
        "Accept": [
            "*/*"
        ],
        "Accept-Encoding": [
            "gzip, deflate, br"
        ],
        "Content-Type": [
            "application/json"
        ],
        "Host": [
            "REDACTED"
        ],
        "Postman-Token": [
            "REDACTED"
        ],
        "User-Agent": [
            "PostmanRuntime/7.32.3"
        ],
        "X-Amzn-Trace-Id": [
            "REDACTED"
        ],
        "X-Forwarded-For": [
            "REDACTED"
        ],
        "X-Forwarded-Port": [
            "443"
        ],
        "X-Forwarded-Proto": [
            "https"
        ]
    },
    "queryStringParameters": null,
    "multiValueQueryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
        "resourceId": "wsryph",
        "resourcePath": "/contact",
        "httpMethod": "POST",
        "extendedRequestId": "Jft41HVGLPEFUTg=",
        "requestTime": "11/Aug/2023:12:30:09 +0000",
        "path": "/Test/contact",
        "accountId": "REDACTED",
        "protocol": "HTTP/1.1",
        "stage": "Test",
        "domainPrefix": "REDACTED",
        "requestTimeEpoch": 1691757009857,
        "requestId": "REDACTED",
        "identity": {
            "cognitoIdentityPoolId": null,
            "accountId": null,
            "cognitoIdentityId": null,
            "caller": null,
            "sourceIp": "REDACTED",
            "principalOrgId": null,
            "accessKey": null,
            "cognitoAuthenticationType": null,
            "cognitoAuthenticationProvider": null,
            "userArn": null,
            "userAgent": "PostmanRuntime/7.32.3",
            "user": null
        },
        "domainName": "REDACTED",
        "apiId": "717s3x0a01"
    },
    "body": "{ \r\n    \"body\":\"Test\",\r\n    \"subject\":\"test\"\r\n}",
    "isBase64Encoded": false
}

有人能指出我犯的一个非常简单的错误吗?这是我第一个使用API网关、lambdas、Node.js和json的项目,所以我知道可能有一百万种方法来改进上面的方法,所以请让我知道我想学习!

最新情况: 新的有效lambda代码:

var aws = require('aws-sdk');
var ses = new aws.SES({ region: 'eu-west-2' });
exports.handler = (event) => {
    sendMail(event);
};

async function sendMail(param) {
    let email = JSON.parse(param.body);
    const emailParams = {
        Destination: {
            ToAddresses: ["EMAIL"],
        },
        Message: {
            Body: {
                Text: { Data: email.body },
            },
            Subject: { Data: email.subject },
        },
        Source: "EMAIL",
    };

    try {
        let response = await ses.sendEmail(emailParams).promise();
        console.log("MAIL SENT SUCCESSFULLY!!");
        console.log("subject:", email.subject);
        console.log("body:", email.body);
        console.log(param);
        return response;
    } catch (e) {
        console.log("FAILURE IN SENDING MAIL!!", e);
        console.log("subject:", email.subject);
        console.log("body:", email.body);
        console.log(param);
    }
    return;
}

工作中的AWS测试:

{
  "body": {
    "subject": "New Test",
    "body": "New test body"
  }
}

postman 测试:

{
    "subject": "Testing",
    "body": "Testing"
}

添加JSON.parse(param.body)修复了最后一个问题!

推荐答案

确保将数据作为JSON发送.在Postman中,try 使用原始JSON方法发送.

然后输入值:

{
  "subject": "Testing",
  "body": "Testing"
}

还要更新您的lambda代码,以从事件有效负载获取Body参数:

var aws = require('aws-sdk');
var ses = new aws.SES({ region: 'eu-west-2' });
exports.handler = (event) => {
    sendMail(event);
};

async function sendMail(param) {

let event = JSON.parse(param.body);
    const emailParams = {
        Destination: {
            ToAddresses: ["**EMAIL**"],
        },
        Message: {
            Body: {
                Text: { Data: event.body },
            },
            Subject: { Data: event.subject },
        },
        Source: "**ANOTHEREMAIL**",
    };

    try {
        let response = await ses.sendEmail(emailParams).promise();
        console.log("MAIL SENT SUCCESSFULLY!!");
        console.log("subject:", event.subject);
        console.log("body:", event.body);
        console.log(JSON.stringify(event));
        return response;
    } catch (e) {
        console.log("FAILURE IN SENDING MAIL!!", e);
        console.log("subject:", event.subject);
        console.log("body:", event.body);
        console.log(JSON.stringify(event));
    }
    return;
}

Node.js相关问答推荐

序列化事务未按预期工作

如何将信号从终端窗口发送到运行在Raspberry Pi上的Puppeteer/Node.js上的webscraper

在我的Next.js应用程序中没有正确设置Process.env.NODE_ENV

自动将Selify打开的Chrome窗口移动到Mac OS中的第三个显示器

在Nest.Js中,如何发送带有表单数据的正文请求并应用正文请求验证.附加的文件是可选的

从MongoDB获取Tree数据

在 puppeteer 中从 pdf 中删除 about:blank 和 date-time

无法从 mongoDB 访问数据?

我正在try 在公共目录中使用 Express.js 项目部署 Angular 静态构建

我误解了外键的工作原理吗?使用续集

为什么 FastAPI 需要 Web 服务器(即 Nginx)而不是 Express API?

Mocha调用所有it回调模拟(测试中间件)

用户与mongoose 的完美搭配

使用 Node.js 在 MongoDB 中搜索

后端位于 Docker 容器中时的 SvelteKit SSR fetch()

如何使用适用于 Node.js 的 AWS 开发工具包将 Amazon S3 中的所有对象从一个前缀复制/移动到另一个前缀

为什么我们要为 Angular 2.0 安装 Node.js?

按日期时间字段获取最新的 MongoDB 记录

__dirname 未在 Node 14 版本中定义

Nodejs将字符串转换为UTF-8