在我基于 NodeJS 的 lambda 中,无法在对 getSignedUrl 的回调中调用 AWS SES sendEmail 函数
Unable to call AWS SES sendEmail function in the call back to getSignedUrl in my NodeJS based lambda
我正在尝试发送通过使用来自我的 lambda 的 aws ses 调用 S3 的 getSigned url 获得的 url,如下所示:
exports.handler = async (event) => {
......
.....
var signedUrl = await s3.getSignedUrl(
"getObject",
parameters,
(error, url) => {
if (error) {
console.log("Error writing to S3", error);
} else {
console.log("Pre-signed url: " + url);
var eparam = {
Destination: {
CcAddresses: ["abc@abc.com"],
ToAddresses: ["xyz@xyz.com"],
},
Message: {
Body: {
Html: {
Charset: "UTF-8",
Data: url // sending url as part of the email
},
Text: {
Charset: "UTF-8",
Data: "TEXT_FORMAT_BODY",
},
},
Subject: {
Charset: "UTF-8",
Data: "Test email",
},
},
Source: "abc@abc.com" /* required */,
ReplyToAddresses: [
"xyz@xyz.com",
],
};
console.log("compiling email... parameters ready", eparam);
var sendPromise = new AWS.SES().sendEmail(eparam).promise();
sendPromise
.then(function (data) {
console.log("Success!! ", data.MessageId);
})
.catch(function (err) {
console.error(err, err.stack);
});
}
}
);
};
问题是我无法发送电子邮件,因为代码既没有输入 sendPromise 的“.then(function (data)”块,也没有在“.catch( function (err) ' 部分。我在这里做错了什么吗?当我尝试在 getSignedUrl 方法的回调部分之外发送电子邮件时,我能够发送电子邮件(当然没有 url !) 但由于我们需要在电子邮件正文中嵌入 url,因此我们必须能够在回调中这样做。有什么办法可以做到吗?
您应该避免混合使用回调和承诺,因为您可以 运行 处理此类问题。尝试将 getSignedUrl
转换为:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrlPromise-property
还要确保您 return 从您的 lambda 处理程序中获得承诺:
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
如果您不return来自异步处理程序的承诺,lambda 函数可能会在您的承诺得到解决之前完成。
我正在尝试发送通过使用来自我的 lambda 的 aws ses 调用 S3 的 getSigned url 获得的 url,如下所示:
exports.handler = async (event) => {
......
.....
var signedUrl = await s3.getSignedUrl(
"getObject",
parameters,
(error, url) => {
if (error) {
console.log("Error writing to S3", error);
} else {
console.log("Pre-signed url: " + url);
var eparam = {
Destination: {
CcAddresses: ["abc@abc.com"],
ToAddresses: ["xyz@xyz.com"],
},
Message: {
Body: {
Html: {
Charset: "UTF-8",
Data: url // sending url as part of the email
},
Text: {
Charset: "UTF-8",
Data: "TEXT_FORMAT_BODY",
},
},
Subject: {
Charset: "UTF-8",
Data: "Test email",
},
},
Source: "abc@abc.com" /* required */,
ReplyToAddresses: [
"xyz@xyz.com",
],
};
console.log("compiling email... parameters ready", eparam);
var sendPromise = new AWS.SES().sendEmail(eparam).promise();
sendPromise
.then(function (data) {
console.log("Success!! ", data.MessageId);
})
.catch(function (err) {
console.error(err, err.stack);
});
}
}
);
};
问题是我无法发送电子邮件,因为代码既没有输入 sendPromise 的“.then(function (data)”块,也没有在“.catch( function (err) ' 部分。我在这里做错了什么吗?当我尝试在 getSignedUrl 方法的回调部分之外发送电子邮件时,我能够发送电子邮件(当然没有 url !) 但由于我们需要在电子邮件正文中嵌入 url,因此我们必须能够在回调中这样做。有什么办法可以做到吗?
您应该避免混合使用回调和承诺,因为您可以 运行 处理此类问题。尝试将 getSignedUrl
转换为:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrlPromise-property
还要确保您 return 从您的 lambda 处理程序中获得承诺: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
如果您不return来自异步处理程序的承诺,lambda 函数可能会在您的承诺得到解决之前完成。