我正在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)修复了最后一个问题!