发布
社区首页 >问答首页 >西纳屈和彪马在终端上的输出是原来的两倍。

西纳屈和彪马在终端上的输出是原来的两倍。
EN

Stack Overflow用户
提问于 2015-07-03 11:45:21
回答 1查看 1.6K关注 0票数 4

我已经将Puma添加到我的sinatra应用程序中,现在我在终端中获得了两行请求输出。我已经检查过了,实际上它并没有调用代码两次,我猜可能Puma和Sinatra一起输出了请求信息。

作为演示,我创建了一个简单的应用程序,如下所示:

Gemfile

代码语言:javascript
代码运行次数:0
复制
source 'https://rubygems.org'
ruby '2.2.0'

gem 'sinatra'
gem 'puma'

config.ru

代码语言:javascript
代码运行次数:0
复制
require 'sinatra'

get '/' do
  'Hello World'
end

run Sinatra::Application

下面是我运行的命令:

代码语言:javascript
代码运行次数:0
复制
rackup -s puma

下面是我浏览http://localhost:9292/时收到的输出类型

代码语言:javascript
代码运行次数:0
复制
R5001755:test louis.sayers$ rackup -s puma
Puma 2.11.3 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:9292
::1 - - [03/Jul/2015:21:46:37 +1000] "GET / HTTP/1.1" 200 11 0.0074
::1 - - [03/Jul/2015:21:46:37 +1000] "GET / HTTP/1.1" 200 11 0.0222

我已经上传了github示例项目如果你想玩的话

对发生了什么事有什么想法吗?谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-05 18:26:16

这是由中间件引起的。它由)Sinatra (启用日志时)添加,从而产生重复的输出。Sinatra实际上使用了一个此中间件的自定义子类来尝试解决这个问题。为了使其工作,它对原始的CommonLogger类进行了修补。

这个问题之所以出现,是因为美洲豹也是CommonLogger,它不包括西纳特拉引入的改变。当Puma在Sinatra之后加载时,Puma版本会覆盖修补版本,因此会出现原始行为(重复的输出行)。

有几种方法可以解决这个问题。您可以禁用Sinatra中的登录功能,以防止添加重复的中间件。Sinatra日志记录设置同时适用于CommonLoggerLogger中间件(这是辅助对象所使用的),因此您可能希望自己添加Logger中间件:

代码语言:javascript
代码运行次数:0
复制
disable :logging
use Rack::Logger

还可以通过在rackup命令中使用-q选项防止-q添加rackup中间件:

代码语言:javascript
代码运行次数:0
复制
$ rackup -q -s puma

另一种选择是确保Puma在Sinatra之前加载,这样当Sinatra修补程序CommonLogger时,它正在修补Puma版本,修补程序不会在稍后被覆盖。您可以通过使用-r选项来rackup来强制它加载彪马来完成这一任务:

代码语言:javascript
代码运行次数:0
复制
$ rackup -s puma -r puma
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31206060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档