如何使用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,但修改中间件不是一个好主意。 只要使用上面的代码。