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

问题描述 投票:0回答:1

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

我遇到了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

基本上将应用程序包装在一个类中,然后从config.ru中调用它。当我通过在目录中运行puma来运行此服务时,该服务将启动,但标题将不再传递回来。每当我尝试进入后端时,我都会得到:

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.

这是我最初设置标题之前遇到的错误。因此,对我来说似乎很清楚set参数被忽略。

因此,这似乎很简单,但是我仍然找不到正确的答案:我如何使Puma尊重'set'参数?或者,如何达到相同的期望结果?

在我看来,我似乎很想念一件非常简单的事情,但我无法弄清楚到底是什么。

提前感谢!

ruby cors rack puma response-headers
1个回答
0
投票

似乎您只是在课程中缺少register Sinatra::Cors

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

  set :allow_origin, '*'
  # etc.
© www.soinside.com 2019 - 2024. All rights reserved.