如何使用Express / Node.js访问Amazon SNS邮件正文

我正在使用Express框架重buildNode.js中的PHP应用程序。

应用程序的一部分是发布Amazon SNS通知的callbackURL。

目前,SNS的POST正文是以下面的方式在PHP中读取(工作):

$notification = json_decode(file_get_contents('php://input')); 

在Express中,我尝试了以下方法:

 app.post('/notification/url', function(req, res) { console.log(req.body); }); 

但是,在观看控制台时,只有在发布信息时才会logging以下信息:

 {} 

所以,重复一下这个问题:你如何使用Express / Node.js访问Amazon SNS邮件正文

另一种方法是修复Content-Type头。

这里是中间件代码来做到这一点:

 exports.overrideContentType = function(){ return function(req, res, next) { if (req.headers['x-amz-sns-message-type']) { req.headers['content-type'] = 'application/json;charset=UTF-8'; } next(); }; } 

这假定有一个名为util.js的文件位于根项目目录中:

 util = require('./util'); 

在你的app.js中,并通过包括以下内容来调用:

 app.use(util.overrideContentType()); 

之前

 app.use(express.bodyParser()); 

app.js文件中。 这允许bodyParser()正确地parsing身体…

不那么干扰,你可以正常访问req.body

这是基于AlexGad的回答。特别是这个评论:

标准expression式parsing器只能处理application / json,application / x-www-form-encoded和multipart / form-data。 我在上面添加了一些代码,放在你的body parser之前。

 app.post('/notification/url', function(req, res) { var bodyarr = [] req.on('data', function(chunk){ bodyarr.push(chunk); }) req.on('end', function(){ console.log( bodyarr.join('') ) }) }) 

看看AWS Node.js SDK – 它可以访问所有AWS服务端点。

  var sns = new AWS.SNS(); // subscribe sns.subscribe({topic: "topic", Protocol: "https"}, function (err, data) { if (err) { console.log(err); // an error occurred } else { console.log(data); // successful response - the body should be in the data } }); // publish example sns.publish({topic: "topic", message: "my message"}, function (err, data) { if (err) { console.log(err); // an error occurred } else { console.log(data); // successful response - the body should be in the data } }); 

编辑:问题是,标准的身体分析器不处理普通/文本这是SNS作为内容types发送。 这是代码提取原始的身体。 将它放在你的bodyparsing器之前:

 app.use(function(req, res, next) { var d= ''; req.setEncoding('utf8'); req.on('d', function(chunk) { d+= chunk; }); req.on('end', function() { req.rawBody = d; next(); }); }); 

然后你可以使用:

 JSON.stringify(req.rawBody)); 

在您的路线内创build一个JavaScript对象,并适当地在SNSpost上操作。

你也可以修改body parser来处理text / plain,但修改中间件不是一个好主意。 只要使用上面的代码。