在 Sinatra 中绕过 not_found 过滤器

Bypass not_found filter in Sinatra

我正在尝试将 Sinatra 配置为

  1. 在所有未找到的请求中显示一个简单的 404 字符串。
  2. 当路由无法满足请求时,在一个路由中发送自定义 404 视频文件。

显示问题的最少代码:

# somefile.txt
some content

# server.rb
require 'sinatra'
require 'sinatra/reloader'

set :bind, '0.0.0.0'
set :port, 3000

not_found do
  content_type :text
  "404 Not Found"
end

get '/test' do
  # in reality this is a video file, not a text file.

  # .. do some work here, and if failed, send 404 file ...

  # this does not work, since it triggers the not_found filter above
  send_file "somefile.txt", type: :text, status: 404

  # this works, but with 200 instead of 404
  # send_file "somefile.txt", type: :text
end

not_found 过滤器捕获一切,甚至 send_file ... status: 404

对我来说,这似乎有点像 send_file 中的错误,但也许我错了。

有没有办法说明 "skip the not_found filter" 或任何其他更合适的方法来实现这一点?

请记住,实际上,此服务器应该 return 一个未找到的视频文件,而不是文本文件。为了简单起见,我在这里使用了文本。

这不是错误,正如 documentation 所述,

When a Sinatra::NotFound exception is raised, or the response’s status code is 404, the not_found handler is invoked:

我想您可以通过将 not_found 覆盖替换为这样的错误处理来解决问题:

error Sinatra::NotFound do
  content_type :text
  "404 Not Found"
end

这应该只在错误时触发,而不是在响应代码时触发。