2013-10-14 10 views
14

Ho un problema con la pubblicazione di sn su un endpoint specifico.
Il mio codice:Come pubblicare sn su un endpoint specifico?

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

      } 
}); 

Quando uso TopicArn, è tutto a posto. Ma quando provo a inviare la notifica a un endpoint specifico prendo errore: Errore nell'invio di un messaggio InvalidParameter: Parametro non valido: Nome argomento
E non ho idea di che tipo di parametri sia e da dove.

+1

hai mai scoperto di cosa si tratta? Sto avendo lo stesso problema con PHP –

+0

Ho lo stesso problema ed è stato perché le impostazioni della regione errate. Controlla le impostazioni della tua regione. – dieend

risposta

11

Qualcosa di simile funziona bene per me. Sono in grado di pubblicare su un endpoint specifico utilizzando: Apple Push Notification Service Sandbox (APNS_SANDBOX)

Si potrebbe anche voler provare e aggiornare aws-sdk, la versione corrente è 1.9.0.

Ecco il mio codice, TargetArn è stato copiato direttamente dalla console SNS. Ho omesso alcuni dei dati, come &

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

Lo hai inchiodato. L'endpoint Arn dovrebbe apparire come arn: aws: sns: us-west-2: 302467918846: endpoint/APNS_SANDBOX//. –

+0

sto avendo lo stesso problema con il php sdk, ma il mio arn enpoint non sembra proprio così ... è arn: aws: sns: us-east-1: : : 1234abcf-56de-12ab- 34cd-12345abcd678. sto cercando di inviare sms a un endpoint specifico; inviando all'intero argomento funziona –

+0

@JonB, sto anche tentando di inviare SMS a un endpoint specifico, il mio formato ARN dell'endpoint (non è davvero un abbonamento arn?) proprio come il tuo. Nessuna fortuna ... Ma l'invio a tutto l'argomento funziona come te. Gli altri funzionano da quando hanno usato "Applicazioni" nel mezzo, ma non l'abbiamo fatto e non ne abbiamo uno. Quindi, hai risolto il problema? se lo fai, per favore aiutami Grazie. – early

7

Si potrebbe avere una Regione non valida. Controlla la regione per l'argomento e impostala di conseguenza. Per esempio, se siete ci-ovest-2 si potrebbe fare qualcosa di simile

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

Questo è ciò che ha risolto un problema simile per me quando ho contrastato il messaggio di errore 'aws lambda Parametro non valido: TopicArn'. Vorrei poterlo sospendere più di una volta. Grazie Clicca Avanti! – yanhan

+0

Uno più uno per questo ... questo era il problema che avevo anche io. L'avrei impostato come risposta al problema –

0

ho avuto lo stesso problema esattamente come te. Il problema è il TargetArn che stai usando, non c'è una documentazione chiara a riguardo. L'errore si verifica se si tenta di inserire l'ARN dell'applicazione in TargetArn.

That will produce the error: 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.

Tutto ciò che dovete fare è mettere l'EndpointArn in TargetArn.

Se avete bisogno di vedere l'EndpointArn, è possibile:

  1. listPlatformApplications call() per ottenere tutte le applicazioni ARN di.
  2. Elenco chiamateEndpointsByPlatformApplication() con l'app ARN per ottenere l'elenco di EndpointArn.

Divertiti!

6

Nessuno di questi funzionerà se non si massaggia il carico utile un po '.

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

Così, si scopre che si deve specificare la struttura del messaggio (essendo JSON). Ho provato a pubblicare su endpoint dalla console AWS e ha funzionato benissimo fintanto che avessi selezionato JSON. Usare RAW non farebbe nulla.

Nel mio script stava facendo era post precedenti stavano facendo:

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

E anche se è stato CloudWatch registrando il successo, non ho mai una volta ricevuto il messaggio. Appena ho aggiunto i dati di MessageStructure e ho formattato correttamente il payload, ha funzionato come un incantesimo.

Il parametro [predefinito] non è utile ma l'ho lasciato lì per mostrare come potrebbe apparire la struttura.

Se non si stringifica la parte del payload.GCM, SNS presenterà il messaggio e dovrebbe indicare che il messaggio dovrebbe includere un elemento "GCM".

L'unica cosa che è fastidiosa è che è necessario sapere qual è il punto finale. Speravo che non fosse necessario formattare il messaggio in base all'endpoint, che in qualche modo sconfigge lo scopo di SNS.

+0

Ottima risposta! Il JSON per GCM è quello che mi mancava. – KVISH

+0

Sei un vero MVP. E.T. Ho avuto questo problema solo con Android, iOS funzionava perfettamente senza dover JSON.stringify APNS/APNS_SANDBOX. – Dan

Problemi correlati