【问题标题】:How to serve a 500 page using Sinatra?如何使用 Sinatra 提供 500 个页面?
【发布时间】:2013-04-24 14:37:03
【问题描述】:

由于 Sintra 是一个 Rack 应用,我认为它可以使用 Rack 方式:

get '/' do
      result = true
      if result 
             ['200', {'Content-Type' => 'application/json'}, [{result:true}.to_  json]]
         else
             binding.pry
             ['500', {'Content-Type' => 'application/json'}, [{result:false}.to  _json]] 
         end    
end  

不行,总是返回500页面,不管变量是true还是false

【问题讨论】:

    标签: sinatra rack


    【解决方案1】:

    如果您的应用中确实有此文字代码:

    {result:true}.to_  json # <<< whitespace that shouldn't be there
    

    那么您的代码将出现运行时异常(可能缺少方法 to_unknown variable or method json),这就是为什么您每次都会收到 500 错误。

    【讨论】:

    • 在这种情况下,这实际上会产生一个 SyntaxError:SyntaxError: (irb):2: syntax error, unexpected tIDENTIFIER, expecting ']',而不是运行时错误,因此服务器甚至不会启动,而不是产生 500 错误。
    【解决方案2】:

    您可以像这样返回一个类似 Rack 的数组作为响应,但数组的第一项必须是 Fixnum,而不是在使用 to_i 解析时会产生数字的东西。 Sinatra checks the type of the entry 来确定如何处理响应。

    您的响应在“纯”Rack 应用程序中有效,但在 Sinatra 中无效。可以说这是 Sinatra 中的一个错误,或者至少是 says any valid Rack response is valid 的文档。

    Sinatra 尝试将整个数组作为响应体返回(因为它响应 each),但在尝试处理数组时失败,因为内容不都是字符串。

    要修复它,只需将响应中的状态代码从 Strings 更改为 Fixnums:

    [200, {'Content-Type' => 'application/json'}, [{result:true}.to_json]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 2017-03-10
      • 1970-01-01
      • 2020-11-12
      相关资源
      最近更新 更多