javascript - AWS SNS Web 服务订阅 - Express 问题,sinatra 示例

标签 javascript node.js amazon-web-services express amazon-sns

我只是想构建一个自动订阅 API,它会发回 token 。我可以在 Sinatra 中非常轻松地做到这一点(从 AWS 渲染 POSTed JSON)——在 Express 中似乎很难;我确信这只是我错过的一些愚蠢的东西,尽管我已经尝试了 1000X 组合。

这是 Sinatra 网络服务器:

# application.rb

require 'rubygems'
require 'sinatra'
require 'json'

set :port, 8081

post '/webservice/cloudwatch' do
  content_type :json
  puts "Body: " + request.body.read
end

哪些日志:

- -> /webservice/cloudwatch
Body: {
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "OMIT",
  "Token" : "OMIT",
  "TopicArn" : "OMIT",
  "Message" : "OMIT",
  "SubscribeURL" : "OMIT",
  "Timestamp" : "2012-02-28T21:28:02.082Z",
  "SignatureVersion" : "1",
  "Signature" : "OMIT",
  "SigningCertURL" : "OMIT"
}

这是 Express 网络服务器:

var express, app, stache;
express = require("express"), app = express.createServer();
app.configure(function () {
  app.use(express.methodOverride());
  app.use(express.bodyParser());
  app.use(app.router);
  app.set("view options", {
    layout: false
  });
  app.use(express.errorHandler({
    dumpExceptions: true,
    showStack: true
  }));
});
app.post("/webservice/cloudwatch", function (request, response) {
  request.accepts('application/json');
  console.log("post body: " + JSON.stringify(request.params));
  console.log("post body: " + JSON.stringify(request.body.read));
});  
app.listen(8081);

哪些日志:

post body: []
post body: undefined

请帮忙!

最佳答案

当亚马逊将 http post 请求发送到您的端点时,它不会指定内容类型。根据他们的回答,这对他们来说是一个已知问题。

与此同时,我一直在测试一个非常hacky的解决方法。我修改了express插件中的bodyParser.js文件。具体来说,我向 mime 函数添加了一个 if 检查,以便我可以根据需要强制它假装内容类型为 application/json

这是修改后的 mime 函数:

function mime(req) {
    if(req.headers['x-amz-sns-message-type'] == 'SubscriptionConfirmation' && !req.headers.hasOwnProperty['content-type']) {
        req.headers['content-type'] = 'application/json';
    }

    var str = req.headers['content-type'] || '';
    return str.split(';')[0];
}

关于javascript - AWS SNS Web 服务订阅 - Express 问题,sinatra 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9490067/

相关文章:

node.js - 在 ZeroMQ 中将多个回复链接到经销商和路由器

amazon-web-services - 是否可以/建议在 AWS CodeBuild 中使用 `sam build`?

linux - 如何在shell脚本中获取单行数据

node.js - 风筝 : connecting to a docker machine with different name

node.js - 如何在 Alexa Skill Kit (ASK) 中流式传输响应

javascript - 带有 es6-promified 对象的 sinon stub

javascript - 在 React 和 Meteor 中使用 Coral Talk

amazon-web-services - 如何使用 IAM 通过 AWS Lambda 调用 AppSync?

javascript - 如何使用 Angular 将逗号分隔的字符串转换为 json 对象类型

javascript - 在 js 中从 Google Maps API 编辑针点描述标签