使用Rails 3消耗mongodb rest api的CORS问题

时间:2013-08-07 15:43:21

标签: ruby-on-rails-3 mongodb rest nginx cors

我在使用mongodb simple rest api的Rails 3应用程序遇到cross-origin resource sharing(CORS)问题。我有一些尝试使用mongodb simple rest api的CoffeeScript / JavaScript,但Chrome会通过以下控制台消息阻止它:

XMLHttpRequest cannot load http://127.0.0.1:28017/my-db/my-collection/. Origin http://127.0.0.1:3000 is not allowed by Access-Control-Allow-Origin.

我添加了这个blog post中的两个控制器方法:

before_filter :cors_preflight_check
after_filter :cors_set_access_control_headers

def cors_set_access_control_headers
  headers['Access-Control-Allow-Origin']  = '*'
  headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  headers['Access-Control-Max-Age']       = '1728000'
end

def cors_preflight_check
  if request.method == :options
    headers['Access-Control-Allow-Origin']  = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
    headers['Access-Control-Allow-Headers'] = 'Content-Type, X-Requested-With, X-Prototype-Version'
    headers['Access-Control-Max-Age']       = '1728000'
    render text: '', content_type: 'text/plain'
  end
end

我可以看到我的Rails页面中存在标题。但是,它仍然无效。

我最好的猜测是mongodb simple rest api使用的任何web服务器都需要包含头文件,而不是我的Rails应用程序。 有人可以确认或否认吗?

我还读到了一些我可以在nginx中使用代理重写规则的地方。但是,这有点单调乏味,特别是因为我没有在开发中运行nginx,只在生产服务器上运行。

1 个答案:

答案 0 :(得分:0)

您在Rails中设置的标题与Chrome发送的用于直接向MongoDB发送的ajax请求的标头无关。您需要使用JSONP来解决CORS问题。

使用--rest--jsonp启动mongod,并正确设置Mongod。然后使用jquery或其他任何方式发出JSONP请求,它应该可以正常工作。