如何将sns发布到特定端点?

时间:2013-10-14 13:50:43

标签: node.js amazon-web-services amazon-sns

我在将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:参数无效:主题名称

我不知道它是什么样的参数,从哪里来。

5 个答案:

答案 0 :(得分:13)

类似的东西对我来说很好。 我可以使用以下方式发布到特定端点:Apple推送通知服务沙箱(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);
        }
    });

答案 1 :(得分:8)

您的区域可能无效。检查主题的Region并相应地进行设置。例如,如果你是us-west-2,你可以做类似

的事情
var sns = new aws.SNS({region:'us-west-2'});

答案 2 :(得分: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]参数没用,但是我把它放在那里以显示结构的样子。

如果你没有字符串化有效载荷.GCM部分,SNS将barf并说你的消息应该包含一个“GCM”元素。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

  

这将产生错误:无效参数:TargetArn原因:&gt; arn:aws:sns:us-west-2:561315416312351:app / APNS_SANDBOX / com.APP_NAME_HERE.app&gt;不是要发布到的有效ARN

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

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

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