Node.js AWS SNS始终将重复消息发布到平台应用程序端点

Node.js AWS SNS始终将重复消息发布到平台应用程序端点,node.js,amazon-web-services,aws-lambda,apple-push-notifications,amazon-sns,Node.js,Amazon Web Services,Aws Lambda,Apple Push Notifications,Amazon Sns,我发现AWS SNS在从AWS Lambda同时向Apple Push Notifications发布多条消息时有一种奇怪的行为——每个发布的消息都会被订阅者接收两次 我的代码如下 handler.js const uuid=require('uuid') const aws=require('aws-sdk'); const sns=新的aws.sns({apiVersion:'2010-03-31'}) const messageSender=async(事件、上下文、回调)=>{ //一个

我发现AWS SNS在从AWS Lambda同时向Apple Push Notifications发布多条消息时有一种奇怪的行为——每个发布的消息都会被订阅者接收两次

我的代码如下

handler.js

const uuid=require('uuid')
const aws=require('aws-sdk');
const sns=新的aws.sns({apiVersion:'2010-03-31'})
const messageSender=async(事件、上下文、回调)=>{
//一个接一个地发送3条消息
publishMessage(“标题1”、“消息1”)
publishMessage(“标题2”,“消息2”)
publishMessage(“标题3”,“消息3”)
返回[]
}
const publishMessage=(标题、消息)=>{
sns.publish({
消息:JSON.stringify({
“默认”:“默认消息”,
“APNS_沙盒”:JSON.stringify({
“aps”:{
“警报”:{
“头衔”:头衔,
“正文”:信息
},
"徽章":一,,
“id”:uuid.v4(),
“foo”:“bar”
}
})
}),
MessageStructure:'json',
主题:process.env.TOPIC\u ARN
}).承诺
log(`主题的消息已发布:${Message}`)
}
但是,如果我只发布一条如下所示的消息,则只会收到一次确切的消息

const messageSender=async(事件、上下文、回调)=>{
publishMessage(“标题1”、“消息1”)
返回[]
}
你知道为什么在发送多条消息时要两次接收同一条消息吗

编辑

在播放发布API一段时间后,我发现了以下内容

复制是由潜在的Amazon SNS错误(?)引起的。如果不发送JSON格式,复制错误将消失。e、 g.删除
MessageStructure:'json'
,并将消息更改为字符串,如下所示

sns.publish({
消息:“这是一条示例消息”,
主题:process.env.TOPIC\u ARN
}).承诺
这是一个解决问题的方法,但是原始问题的根本原因仍然未知

该解决方案有一些缺点,因为它无法使用APN属性(例如为推送通知添加标题以及徽章)自定义通知


还有其他的解决方法吗?或者知道修复方法的人?

在花了几个小时挠头之后,我终于找到了问题所在

我在json消息中添加了一个定制的
id
字段,当同时发布多条消息时,该字段会导致同一条消息被发送两次

删除
id
字段后,无论同时发布多少条消息,消息只发送一次

{
“默认”:“默认消息”,
“APNS_沙盒”:JSON.stringify({
“aps”:{
“警报”:{
“头衔”:头衔,
“正文”:信息
},
"徽章":一,,

//“id”:uuid.v4(),我也遇到了同样的问题,但上面的方法没有帮助

在我的例子中,我使用了回调函数和.promise()方法

i、 e.我有一些类似于:

await SNS.publish({
    TopicArn: process.env.SNS_TOPIC,
    Message: message,
    MessageAttributes: {
        source: {DataType: 'String', StringValue: source},
        level: {DataType: 'String', StringValue: level}
    },
}, function(err, data) {
    if (err) {
        console.log('SNS_notify: error -', err);
    } else {
        console.log('SNS_notify: sent -', data.MessageId);
    }
).promise();
将此更改为:

let data = await SNS.publish({
    TopicArn: process.env.SNS_TOPIC,
    Message: message,
    MessageAttributes: {
        source: {DataType: 'String', StringValue: source},
        level: {DataType: 'String', StringValue: level}
    },
}).promise();

console.log('SNS_notify: sent -', data.MessageId);
解决了这个问题