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