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.
这是基于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)