DynamoDB初始化顺序影响Amazon SES

时间:2016-09-29 21:28:11

标签: amazon-web-services amazon-dynamodb amazon-ses

通过SES服务发送邮件时,我遇到了SES的sendEmail方法喷出的以下错误消息。

{ [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 }

经过相当多的调试后,我已经缩小了问题,这与DynamoDB和SES对象的初始化顺序有关。以下测试代码重现了该问题:

'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: ['test@example.com']
    },
    Message: {
        Body: { 
            Html: {Data: "This is a test"},
            Text: {Data: "This is a test"}
        },
        Subject: {Data: "Important"}
    },
    Source: '<noreply@example.com>',
};

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

上面的代码序列给出了错误。但是,如果我移动“var ses = new AWS.SES();”在DynamoDB之前的语句然后代码工作。我很想知道可能是什么原因

2 个答案:

答案 0 :(得分:1)

在你的config.update中输入这些

accessKeyId: 'any_values', 
secretAccessKey: 'any_values'

当你在本地开发时

答案 1 :(得分:1)

是的 - 文档说要执行AWS.config.update({endpoint: 'http://localhost:8000'})以使DynamoDB在本地运行。然而,这实际上是非常糟糕的建议,因为aws-sdk无法被实例化为离散对象。这意味着,在您的应用程序中的某个位置为AWS设置endpoint实际上会为您拥有endpoint - d require的每个变量设置aws-sdk,从而破坏任何AWS使用另一个端点的服务(例如SES)。

正确的解决方案似乎是为DynamoDB设置endpoint而不使用&#34;污染&#34;其他AWS服务的设置如下:

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