run nodejs node ec2 aws app node.js amazon-web-services amazon-sns

node.js - nodejs - ¿Cómo publicar sns a un punto final específico?



nodejs app on aws (5)

Tengo un problema con la publicación de sns en un punto final específico.

Mi código:

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); } });

Cuando uso TopicArn , todo está bien. Pero cuando intento enviar una notificación a un punto final específico, tomo el error:

Error al enviar un mensaje InvalidParameter: Parámetro no válido: Nombre del tema

Y no tengo idea de qué tipo de parámetros es y de dónde.



Algo similar funciona bien para mí. Puedo publicar en un punto final específico utilizando: Sandbox del servicio de notificaciones push de Apple (APNS_SANDBOX)

Es posible que también desee probar y actualizar el aws-sdk, la versión actual es 1.9.0.

Aquí está mi código, TargetArn se copió directamente desde la consola SNS. Omite algunos de los datos, como &

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); } });


Es posible que tenga una región no válida. Compruebe su región para el tema y ajústelo en consecuencia. Por ejemplo, si eres us-west-2 podrías hacer algo como

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


Estaba teniendo el mismo problema que tú. El problema es el TargetArn que estás usando, no hay documentación clara al respecto. Se produce un error si intenta poner la aplicación ARN en TargetArn.

Eso producirá el error: Parámetro no válido: Razón de TargetArn:> arn: aws: sns: us-west-2: 561315416312351: app / APNS_SANDBOX / com.APP_NAME_HERE.app> no es un ARN válido para publicar.

Todo lo que necesita hacer es colocar el EndpointArn en el TargetArn.

Si necesita ver el EndpointArn, puede:

  1. Llame a listPlatformApplications () para obtener todas las aplicaciones de ARN.
  2. Llame a listEndpointsByPlatformApplication () con el ARN de la aplicación para obtener la lista de EndpointArn.

¡Disfrutar!


Nada de esto funcionará si no masajeas un poco la carga útil.

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); });

Entonces, resulta que tiene que especificar la estructura del mensaje (siendo json). Intenté publicar en el punto final desde la consola de AWS y funcionó muy bien siempre que seleccioné JSON. Usar RAW no haría nada.

En mi guión que estaba haciendo estaban las publicaciones anteriores que estaban haciendo:

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

Y a pesar de que CloudWatch fue exitoso, nunca recibí el mensaje. Tan pronto como agregué los datos de MessageStructure y formateé correctamente la carga útil, funcionó a la perfección.

El parámetro [predeterminado] no es útil, pero lo dejé ahí para mostrar cómo podría verse la estructura.

Si no alinea la parte de la carga útil.GCM, SNS vomitará y dirá que su mensaje debe incluir un elemento "GCM".

Lo único que es molesto es que se le exige saber cuál es el punto final. Tenía la esperanza de que no tuviera que formatear el mensaje en función del punto final, lo que realmente anula el propósito de SNS de alguna manera.