node.js - 设备未收到来自 lambda 函数的已发布 sns 消息
问题描述
我有一个非常简单的 lambda 函数,可以将消息发布到这样的主题:
const AWS = require('aws-sdk');
const sns = new AWS.SNS()
const TOPIC_ARN = "arn:aws:sns:us-east-1:<topic ARN>";
const TARGET_ARN = "arn:aws:sns:us-east-1:<target ARN>";
exports.handler = async (event) => {
return sns.publish({
Message: JSON.stringify({
"default": "any value",
"GCM": "{ \"notification\": { \"body\": \"message body\", \"title\": \"message title \", \"sound\":\"default\" } , \"data\" : {\"key\" : \"value\", \"key2\" : \"value\" } }"
}),
TargetArn: TARGET_ARN,
// TopicArn: TOPIC_ARN, also tried this same result
})
.promise()
.then(() => ({statusCode: 204, body: ''}))
.catch(err => {
console.log(err);
return {statusCode: 500, body: 'sns-error'};
});
};
该函数执行没有问题,我可以在我的云监视日志中看到一个成功事件。
问题是设备从未收到通知。
我知道 ARN 是正确的,因为我可以转到 SNS 控制台并将相同的消息发布到设备并被接收。
我还可以在我的本地机器上启动 nodejs 应用程序并将相同的消息发布到 ARN 并且它被接收,没问题。
我还在平台应用程序上配置了交付状态日志记录,我可以从 lambda 函数中看到类似这样的成功响应:
{
"notification": {
"messageMD5Sum": "<sting of numbers>",
"messageId": "<sting of numbers>",
"timestamp": "2021-07-23 15:35:02.167"
},
"delivery": {
"deliveryId": "<sting of text>",
"destination": "<ARN>",
"providerResponse": "{\"multicast_id\":<sting of numbers>,\"success\":1,\"failure\":0,\"canonical_ids\":0,\"results\":[{\"message_id\":\"0:<sting of text>\"}]}",
"dwellTimeMs": 28,
"attempts": 1,
"token": <correct device token>,
"statusCode": 200
},
"status": "SUCCESS"
}
为什么 lambda 函数是设备不接收 SNS 通知的唯一方法?
解决方案
const AWS = require('aws-sdk');
const sns = new AWS.SNS()
const TOPIC_ARN = "arn:aws:sns:us-east-1:<topic ARN>";
const TARGET_ARN = "arn:aws:sns:us-east-1:<target ARN>";
exports.handler = async (event) => {
return sns.publish({
Message: JSON.stringify({
"default": "any value",
"GCM": "{ \"notification\": { \"body\": \"message body\", \"title\": \"message title \", \"sound\":\"default\" } , \"data\" : {\"key\" : \"value\", \"key2\" : \"value\" } }"
}),
MessageStructure: 'json', //this solved the problem
TargetArn: TARGET_ARN,
})
.promise()
.then(() => ({statusCode: 204, body: ''}))
.catch(err => {
console.log(err);
return {statusCode: 500, body: 'sns-error'};
});
};
添加MessageStructure: 'json'解决了这个问题。
感谢所有建议。
解决方案
编辑原始问题以包括答案:
添加MessageStructure: 'json'解决了这个问题。
感谢所有建议。
推荐阅读
- java - 用按钮链接气泡选择器中的气泡
- python - 为什么 df.cumsum() 给出 ValueError: Wrong number of items passed, placement 意味着 1
- performance - 了解elasticsearch慢查询日志格式
- arrays - 如何在汇编语言中切换数组的第一个和第二个、第三个和第四个等元素并以 dec 输出?
- javascript - 反应钩子useState不能存储json或字符串
- python - 我将图片转换为 GIF,但海龟的 bgpic() 仍然无法正常工作
- .net - 使用 moq 在 xunit 中更新操作
- typescript - 使用 Lerna、Typescript 和 VS Code 将某些路径排除在自动导入之外
- bash - 如何将“ls”输出附加到文本文件中前一行的末尾,中间有空格?
- typescript - typescript 如何找到 .d.ts 文件?