【问题标题】:Order of DynamoDB initialization impacts Amazon SESDynamoDB 初始化顺序会影响 Amazon SES
【发布时间】:2017-02-21 20:06:36
【问题描述】:

通过 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 之前的语句然后代码工作。我很想知道可能是什么原因

【问题讨论】:

  • 我很确定是 AWS.config.update({endpoint: 'http://localhost:8000'}); 线路搞砸了 SES。不是它在 DynamoDB 线之后出现的事实。
  • 我刚刚尝试评论那行,你是绝对正确的。你知道为什么会这样吗?
  • 它为您在该行之后启动的所有 AWS 服务设置端点。您的本地主机上没有运行 SES 端点,因此会破坏 SES。
  • 好的,是的,这是有道理的——希望错误更直观。感谢您分享您的 cmets
  • 是的,设置 AWS.config.update({endpoint: 'http://localhost:8000'}) 以使 Dynamodb 运行会创建神秘的“XMLParserError”。那么如何为 SES + Dynamodb 设置本地开发盒?

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


【解决方案1】:

在你的 config.update 中放这些

accessKeyId: 'any_values', 
secretAccessKey: 'any_values'

当您从事本地开发工作时

【讨论】:

    【解决方案2】:

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

    正确的解决方案似乎是为 DynamoDB 设置 endpoint 而不会像这样对其他 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
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2016-10-12
      • 1970-01-01
      相关资源
      最近更新 更多