AWS SNS确认订阅请求处理问题

12
我正在尝试为S3存储桶实现AWS SNS服务,我正在按照此文档https://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.html的步骤进行操作。根据此文档,在确认订阅时请求中将包含订阅URL,该URL将发送到我们提供的URL,但是我收到的请求中没有消息体。我尝试记录消息体,但返回了一个空对象。我还尝试使用bodyparser,但结果相同。 这是我正在实现的路由:
 router.post("/s3FileCallback", function (req, res) {
      debugger;
      var bodyParser = require('body-parser');
      var app = express();
      app.use(bodyParser.urlencoded({ extended: false }));
      app.use(bodyParser.json())
      if (req.get("x-amz-sns-message-type") == "SubscriptionConfirmation") {
        console.log("arn" + req.get("x-amz-sns-topic-arn"));
        const subscribeUrl = req.body.SubscribeURL;
        console.log("subscribeUrl" + subscribeUrl);
})

我是否遗漏了什么?请问有人能指点我正确的方向吗?


请告诉我,如果我的问题不清楚或者我没有提供足够的细节。 - Manoj
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
35

我找到了我所缺失的东西,

router.post('/s3FileCallback', function(req, res) {
    debugger;
    if (req.get('x-amz-sns-message-type') == 'SubscriptionConfirmation') {
        console.log('arn' + req.get('x-amz-sns-topic-arn'));
        const subscribeUrl = req.body.SubscribeURL;
        console.log('subscribeUrl' + subscribeUrl);
    }
});
我正在使用body parser作为中间件,亚马逊在post请求中发送content-type为text\plain,感谢这个论坛,我意识到了类型直到我遇到了这个 https://forums.aws.amazon.com/message.jspa?messageID=261061#262098 所以尝试在使用bodyparser之前改变头部的方法。
app.use(function(req, res, next) {
    if (req.get('x-amz-sns-message-type')) {
        req.headers['content-type'] = 'application/json';
    }
    next();
});
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: false }));

现在该请求被解析为 JSON 格式。


6
救生员。我不明白为什么自2011年以来他们没有修复这个问题。 - klh
我曾经遇到过同样的问题。你的回答非常有帮助。谢谢! - Anant Sinha
3
这需要更多的赞。任何使用Node和Express尝试读取传入请求的人都会遇到这个问题。 - jjspierx
2020年了,问题仍未解决 :( 浪费了3个小时在这上面。 - roneo
非常感谢。这是AWS文档中缺失的信息。 - Philip Enc
六个小时的痛苦编程和抓头,直到我想到去网上查看是否只有我遇到了这个问题...谢谢! - Nitai

1
如果您正在使用PHP,这应该可以工作。
$res = file_get_contents('php://input');
file_put_contents('response.txt', $res. "\n", FILE_APPEND);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,