通过 Puma 从 Sinatra 传递 headers(或其他设置)

Passing headers (or other settings) from Sinatra through Puma

我正在尝试学习如何使用纯 Ruby 开发简单的 Web 应用程序。我有一个简单的后端服务,我将其创建为 Sinatra 应用程序。在开发它时,我注意到由于 CORS 策略,前端(一个简单的 HTML/JS 静态站点)不会与其通信。所以我研究了如何从 Sinatra 传递 headers。

我遇到了 sinatra-cors。我按照说明进行设置,我的应用程序如下所示(缩写):

require 'sinatra'
require 'sinatra/cors'

  set :allow_origin, '*'
  set :allow_methods, 'GET,HEAD,POST'
  set :allow_headers, 'content-type,if-modified-since,access-control-allow-methods,access-control-allow-origin'
  set :expose_headers, 'content-disposition'
  set :allow_credentials, true

  post '/' do
    [...]
  end

当我 运行 它与 ruby app.rb 时,它工作得很好。前端可以通信并遵守 CORS 策略。

现在,我想为生产环境设置服务。为此,我想使用 Puma。所以对于 Puma,我有一个 config.ru 看起来像这样:

require File.expand_path('app', File.dirname(__FILE__))
run WebApp

我修改了我的 app.rb 看起来像这样(再次缩写):

require 'sinatra'
require 'sinatra/cors'

class WebApp < Sinatra::Application

  set :allow_origin, '*'
  set :allow_methods, 'GET,HEAD,POST'
  set :allow_headers, 'content-type,if-modified-since,access-control-allow-methods,access-control-allow-origin'
  set :expose_headers, 'content-disposition'
  set :allow_credentials, true

  post '/' do
    [...]
  end
end

基本上,将应用程序包装在 class 中,然后从 config.ru 中调用它。当我在运行这个目录下运行宁puma的时候,服务上来了,但是headers都不再回传了。每当我尝试访问后端时,我都会得到:

Access to XMLHttpRequest at 'http://localhost:4567/' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

这是我在最初设置 headers 之前遇到的错误。所以我很清楚 set 参数被忽略了。

所以,这似乎是一件简单的事情,但我一直无法找到合适的答案:如何让 Puma 尊重 'set' 参数?或者,如何实现相同的预期结果?

我似乎很清楚我错过了一个非常简单的东西,但我无法弄清楚它到底是什么。

提前致谢!

您的 class 中似乎缺少 register Sinatra::Cors

class WebApp < Sinatra::Application
  register Sinatra::Cors # Add this line.

  set :allow_origin, '*'
  # etc.