我正试图发送通过使用我的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-属性
还要确保您从lambda处理程序返回了一个promise:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
如果您没有从异步处理程序返回promise,lambda函数可能会在您的promise被解析之前完成。