19

我在将 sns 发布到特定端点时遇到问题。

我的代码:

var AWS = require('aws-sdk');
AWS.config.loadFromPath('/web/config.json');

var sns = new AWS.SNS();
sns.publish({
    // TopicArn:'arn:aws:sns:us-west-2:302467918846:MyTestTopik',
    TargetArn: 'arn:aws:sns:us-west-2:302467918846:MyTestTopik:613ee49c-d4dc-4354-a7e6-c1d9d8277c56',
    Message: "Success!!! ",
    Subject: "TestSNS"
}, function(err, data) {
    if (err) {
        console.log("Error sending a message " + err);
    } else {
        console.log("Sent message: " + data.MessageId);

    }
});

当我使用TopicArn时,一切都很好。但是当我尝试向特定端点发送通知时,我会出错:

发送消息时出错 InvalidParameter: Invalid parameter: Topic Name

而且我不知道它是什么类型的参数以及来自哪里。

4

5 回答 5

15

类似的东西对我来说很好用。我可以使用以下方式发布到特定端点:Apple Push Notification Service Sandbox (APNS_SANDBOX)

您可能还想尝试更新 aws-sdk,当前版本是 1.9.0。

这是我的代码,TargetArn 是直接从 SNS 控制台复制的。我省略了一些数据,比如 &

var sns = new AWS.SNS();
var params = {
    TargetArn:'arn:aws:sns:us-west-2:302467918846:endpoint/APNS_SANDBOX/<APP_NAME>/<USER_TOKEN>'
    Message:'Success!!! ',
    Subject: 'TestSNS'
};

sns.publish(params, function(err,data){
        if (err) {
            console.log('Error sending a message', err);
        } else {
            console.log('Sent message:', data.MessageId);
        }
    });
于 2013-10-19T21:03:33.317 回答
9

您可能有一个无效的区域。检查您的主题区域并进行相应设置。例如,如果您是 us-west-2,您可以执行类似的操作

var sns = new aws.SNS({region:'us-west-2'});
于 2014-02-19T22:26:08.030 回答
7

如果您不稍微按摩一下有效载荷,这些都不会起作用。

        var arn = 'ENDPOINT_ARN';
        console.log("endpoint arn: " + arn);

        var payload = {
            default: message_object.message,
            GCM: {
                data: {
                    message: message_object.message
                }
            }
        };

        // The key to the whole thing is this
        //
        payload.GCM = JSON.stringify(payload.GCM);
        payload = JSON.stringify(payload);

        // Create the params structure
        //
        var params= { 
            TargetArn: arn,
            Message: payload,
            MessageStructure: 'json' // Super important too
        };

        sns.publish(params , function(error, data) {
            if (error) {
                console.log("ERROR: " + error.stack);
            }
            else {
                console.log("data: " + JSON.stringify(data));
            }

            context.done(null, data);
        });

因此,事实证明您必须指定消息结构(即 json)。我尝试从 AWS 控制台发布到端点,只要我选择 JSON,它就可以很好地工作。使用 RAW 将无济于事。

在我的脚本中,之前的帖子正在做:

var params = {
    TargetArn: arn,
    Message:'Success!!! ',
    Subject: 'TestSNS'
};

即使 CloudWatch 记录成功,我也从未收到过消息。一旦我添加了 MessageStructure 数据并正确格式化了有效负载,它就像一个魅力。

[default] 参数没有用,但我将它留在那里以显示结构的外观。

如果您没有对 payload.GCM 部分进行字符串化,SNS 会吐槽并说您的消息应该包含“GCM”元素。

唯一令人讨厌的是您需要知道端点是什么。我希望您不必根据端点格式化消息,这在某些方面确实违背了 SNS 的目的。

于 2015-06-24T23:51:03.787 回答
1

您是否正在尝试其他推送通知(如短信)的端点?直接寻址当前仅适用于推送通知端点。这就是当您尝试发布到不允许直接直接寻址的特定端点时会遇到的错误!

http://aws.amazon.com/sns/faqs/#Does_SNS_support_direct_addressing_for_SMS_or_Email

于 2014-11-23T03:10:05.407 回答
0

我和你有完全相同的问题。问题是您正在使用的 TargetArn,没有关于它的明确文档。如果您尝试将应用程序 ARN 放入 TargetArn,则会发生错误。

这将产生错误: Invalid parameter: TargetArn Reason: >arn:aws:sns:us-west-2:561315416312351:app/APNS_SANDBOX/com.APP_NAME_HERE.app is >not a valid ARN to publish to。

您需要做的就是将 EndpointArn 放入 TargetArn。

如果您需要查看 EndpointArn,您可以:

  1. 调用 listPlatformApplications() 以获取所有应用程序 ARN。
  2. 使用 App ARN 调用 listEndpointsByPlatformApplication() 以获取 EndpointArn 的列表。

享受!

于 2015-05-28T21:48:00.217 回答