我正在Express框架之上的Node.js中重建一个PHP应用程序。
应用程序的一部分是一个回调url,Amazon SNS notification被发送到该url。
SNS中的POST正文当前在PHP中以以下方式读取(可以工作):
$notification = json_decode(file_get_contents('php://input'));
在Express中,我尝试了以下操作:
app.post('/notification/url', function(req, res) {
console.log(req.body);
});
但是,通过观察控制台,这只会在执行post时记录以下内容:
{}
所以,重复一下问题:如何使用Express/Node.js访问Amazon SNS帖子正文
5条答案
按热度按时间mzsu5hc01#
另一种方法是修复Content-Type头。
下面是中间件代码:
这里假设根项目目录中有一个名为***util.js***的文件,其中包含:
在您的***app.js***中,并通过包含以下内容来调用:
之前
在***app.js***文件中。这允许bodyParser()正确解析正文...
侵入性更低,您可以正常访问***req.body***。
xxb16uws2#
这是基于AlexGad的回答。特别是这条评论:
标准的express解析器只处理application/json,application/x-www-form-encoded和multipart/form-data。我在上面添加了一些代码放在你的body解析器之前。
insrf1ej3#
看看AWS Node.js SDK-它可以访问所有AWS服务端点。
编辑:问题是标准的正文解析器不处理SNS作为内容类型发送的纯文本,下面是提取原始正文的代码,放在你的正文解析器前:
然后,您可以用途:
在你的路由中创建一个javascript对象,并对SNS帖子进行适当的操作。
你也可以修改body解析器来处理text/plain,但是修改中间件不是一个好主意。
rslzwgfq4#
假设你使用body-parser,下面是你如何做到这一点。
只需将以下代码行添加到您的app.js中:
这些信息也可以在body-parser官方文档中找到:
https://github.com/expressjs/body-parser
nom7f22z5#
这里的问题是Amazon SNS默认将
Content-Type
标头设置为text/plain
。现在,Amazon SNS中有一个内置的解决方案,它刚刚推出了对从主题交付的HTTP消息的自定义Content-Type
标头的支持。以下是发布帖子:https://aws.amazon.com/about-aws/whats-new/2023/03/amazon-sns-content-type-request-headers-http-s-notifications/您必须修改Amazon SNS订阅的
DeliveryPolicy
属性,将headerContentType
属性设置为application/json
或支持的任何其他值。您可以在此处找到支持的所有值:https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html#creating-delivery-policy您可以通过调用
Subscribe
或SetSubscriptionAttributes
API操作来设置DeliveryPolicy
属性:或者,您也可以使用
AWS::SNS::Subscription
资源使用AWS CloudFormation来设置此策略。