gpt4 book ai didi

node.js - AWS Lambda SNS 两次发送主题

转载 作者:行者123 更新时间:2023-12-04 10:23:59 26 4
gpt4 key购买 nike

长话短说

编写一个 lambda 函数来执行一些数据库查询,然后向某些用户组发送电子邮件。

  • 为歌曲分享到的每个群组发布 SNS 消息
  • 每个组都有自己的成员,因此有自己的一组电子邮件
  • SNS 主题为每个组发送两次。

成员(member)收到两次电子邮件。

该应用是一款音乐流媒体应用,用户可以在其中创作歌曲。他们还可以创建群组、邀请成员加入这些群组并与这些群组分享他们的歌曲。

这是通过 API 调用的 lambda:

  const shareWithGroup = async event => {
const { songCuid, groupCuids } = JSON.parse(event.body);
const shareSongDB = await query(
sql.queryShareWithGroup(songCuid, groupCuids),
); //share to group in DB
if (!shareSongDB) {
return corsUtil.failureWithCors("Couldn't Share Song with group");
}
const song = await query(sql.queryRead(songCuid));
if (!song) {
return corsUtil.failureWithCors('Song doesnt exist');
}
const songTitle = song.rows[0].songTitle; //retrieve songTitle
const promises = groupCuids.map(async groupCuid => {
console.log('GROUP_CUID', groupCuid);
const emailResults = await query(sql.queryReadGroupEmails(groupCuid)); // get emails for group + groupName
const results = emailResults.rows;
const groupName = results[0].groupName;
let emails = [];
results.map(row => {
emails.push(row.email); //push email address into array
});
const payload = JSON.stringify({ groupName, emails, songTitle }); //send groupName, emails list and songTitle to SNS to trigger email
console.log(payload);
await publishSNS(payload)
//send the topic
});

//Resolve all promises
await Promise.all(promises);
console.log(promises);
return corsUtil.successWithCors('Success');
};

const publishSNS = async payload => {
console.log('publishing sns topic');
//SEND EMAILS
const params = {
Message: payload,
TopicArn: `arn:aws:sns:eu-west-1:${process.env.AWS_ACC_ID}:${process.env.STAGE}-songShareTrigger`,
};

return await sns
.publish(params, async error => {
if (error) {
console.error(error);
//TODO: Actually fail the function - can't do with lambdaFactory
}
})
.promise();
};

以及示例请求(将歌曲分享给一组):

{"songCuid":"XXX","groupCuids":["XXX"]}

问题是,尽管它应该只发送 1 个 SNS 主题,但它却发送了 2 个。当我将一首歌分享给 2 个群组时,它发送了 4 个 SNS 主题。

这是由 SNS 主题触发的 lambda:

const aws = require('aws-sdk');
const ses = new aws.SES();
const corsUtil = require('../utils/corsUtil');

exports.songShareEmail = (event, context) => {
console.log('EVENT : ', event.Records[0].Sns); // LOG SNS
const body = JSON.parse(event.Records[0].Sns.Message);
const { groupName, emails, songTitle } = body;
console.log('Body : ', body);

const groupInviteEmailData = `
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<div class="email-body" style="max-width:900px; margin:auto;" >
<div class="content" style="background-color:white; margin:0 auto;
display:block;">
<p>Hello<p>
</br>
A new song has been shared to the group : <u>${groupName}</u><br>
<h3>Song Title: ${songTitle}</h3>

</div>
</div>
</body>
</html>
`;

var params = {
Destination: {
ToAddresses: emails,
},
Message: {
Body: {
Html: {
Charset: 'UTF-8',
Data: groupInviteEmailData,
},
},
Subject: {
Charset: 'UTF-8',
Data: `New song shared to ${groupName}`,
},
},
Source: 'xxx',
};
console.log('sendingEmail');
ses.sendEmail(params, function(err) {
if (err) {
console.log(err);
const response = corsUtil.failureWithCors(err);
context.fail(response);
} else {
context.succeed('Done');
}
});
};

我已经从事件中记录了 SNS 对象,我可以看到它每次都是一个新的 MessageId,这意味着它实际上每次发送 2 个主题,而不是 lambda 被同一个触发两次社交网络。

有什么办法解决这个问题吗?

最佳答案

所选答案只对了一半。

我也遇到了同样的问题。您需要使用带有回调的 SNS 或使用 SNS 在构造函数中设置 api 版本并使用 promise()

const sns = new SNS({ apiVersion: '2010-03-31' });
await sns
.publish(
{
Message: 'Message',
TopicArn: <Arn>,
},
)
.promise();

如果你没有在构造函数中传入 apiVersion,你必须传入一个回调,而不是使用 promise()

关于node.js - AWS Lambda SNS 两次发送主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60711134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com