如何使用Express/Node.js访问Amazon SNS帖子正文

tim*_*tic 15 node.js amazon-sns express

我正在Express框架之上重建Node.js中的PHP应用程序.

该应用程序的一部分是发布Amazon SNS通知的回调URL .

来自SNS的POST主体目前在PHP中以下列方式读取(有效):

$notification = json_decode(file_get_contents('php://input'));
Run Code Online (Sandbox Code Playgroud)

在Express中我尝试了以下内容:

app.post('/notification/url', function(req, res) {
    console.log(req.body);
});
Run Code Online (Sandbox Code Playgroud)

但是,观看控制台时,只会在发布帖子时记录以下内容:

{}
Run Code Online (Sandbox Code Playgroud)

因此,重复一个问题:如何使用Express/Node.js访问Amazon SNS帖子正文

小智 33

另一种方法是修复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();
  };
}
Run Code Online (Sandbox Code Playgroud)

这假设在根项目目录中有一个名为util.js的文件,其中包含:

util = require('./util');
Run Code Online (Sandbox Code Playgroud)

在你的app.js中并通过包括:

app.use(util.overrideContentType());
Run Code Online (Sandbox Code Playgroud)

之前

app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)

app.js文件中.这允许bodyParser()正确解析正文...

更少侵入性,然后您可以正常访问req.body.

  • 这是一个很好的答案,特别是如果您想使用相同的应用程序来处理来自SNS的通知和订阅确认. (3认同)

tim*_*tic 5

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

标准表达式解析器只处理application/json,application/x-www-form-encoded和multipart/form-data.我在上面添加了一些代码,放在你的身体解析器之前.

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('') )
    })  
})
Run Code Online (Sandbox Code Playgroud)