2016-09-29 2 views
3

Lors de l'envoi de messages via le service SES, le message d'erreur suivant est diffusé par la méthode sendEmail de SES.Ordre des impacts de l'initialisation de DynamoDB Amazon SES

{ [XMLParserError: Non-whitespace before first tag. 
Line: 0 
Column: 1 
Char: {] 
    message: 'Non-whitespace before first tag.\nLine: 0\nColumn: 1\nChar: {', 
    code: 'XMLParserError', 
    retryable: true, 
    time: Thu Sep 29 2016 15:34:20 GMT-0400 (Eastern Daylight Time), 
    statusCode: 500 } 

Après un peu de débogage j'ai rétréci vers le bas que le problème est lié l'ordre d'initialisation des objets DynamoDB et SES. Le code de test suivant reproduit le problème:

'use strict'; 

var AWS = require('aws-sdk'); 
AWS.config.update({region:'us-east-1'}); 

//var ses = new AWS.SES(); // This works 
var dynamodb = new AWS.DynamoDB(); 
var docClient = new AWS.DynamoDB.DocumentClient(); 
AWS.config.update({endpoint: 'http://localhost:8000'}); 
var ses = new AWS.SES(); // Does not work 

var params = { 
    Destination: { 
     ToAddresses: ['[email protected]'] 
    }, 
    Message: { 
     Body: { 
      Html: {Data: "This is a test"}, 
      Text: {Data: "This is a test"} 
     }, 
     Subject: {Data: "Important"} 
    }, 
    Source: '<[email protected]>', 
}; 

ses.sendEmail(params, function(err, data) { 
    if (err) { 
     console.log("Error sending email", err); 
    } 
    else 
     console.log("Sent email"); 
}); 

La séquence de code ci-dessus donne une erreur. Cependant, si je déplace le "var ses = new AWS.SES();" déclaration avant DynamoDB puis le code fonctionne. Je suis très curieux de savoir ce qui pourrait être la cause

+3

Je suis assez sûr que c'est la 'AWS.config.update ({point final: 'http: // localhost: 8000'}); 'ligne qui gâche SES. Pas le fait qu'il arrive après la ligne DynamoDB. –

+0

J'ai juste essayé de commenter cette ligne et vous avez absolument raison. Savez-vous la raison pour laquelle c'est le cas? – Atul

+0

Il définit le point de terminaison pour tous les services AWS que vous lancez après cette ligne. Vous n'avez pas de point de terminaison SES en cours d'exécution sur votre hôte local, ce qui casse SES. –

Répondre

1

Dans votre config.update mettre ces

accessKeyId: 'any_values', 
secretAccessKey: 'any_values' 

lorsque vous travaillez le développement local

1

Yes- la documentation dit de faire AWS.config.update({endpoint: 'http://localhost:8000'}) pour DynamoDB fonctionne localement. Cependant, ceci est en fait un mauvais conseil, puisque aws-sdk ne peut pas être intensionné en objets discrets. Cela signifie que définir endpoint pour AWS en un seul endroit dans votre application définira en réalité endpoint pour chaque variable que vous avez require -d aws-sdk dans, brisant ainsi tous les services AWS (tels que SES) qui utilisent un autre point de terminaison.

La bonne solution semble être de mettre endpoint pour DynamoDB sans « polluer » les paramètres pour d'autres services AWS comme ceci:

const dynamodb = new AWS.DynamoDB({ 
    region: 'eu-west-1', 
    endpoint: 'http://localhost:8000'   // <- set endpoint here 
}) 
const docClient = new AWS.DynamoDB.DocumentClient({ 
    service: dynamodb 
})