2

我目前正在尝试将 Rails 3.2 应用程序升级到 Rails 4.0.13(ruby 2.3.5,PostgreSQL 9.4.13),运行集成测试时出现此错误;

      :  PG::UnableToSend at /companies/get_current_firm
      : ===============================================
      : 
      : > socket not open
      : 
      : 
      : activerecord (4.0.13) lib/active_record/connection_adapters/postgresql_adapter.rb, line 798
      : -------------------------------------------------------------------------------------------
      : 
      : ``` ruby
      :   793           end
      :   794   
      :   795           FEATURE_NOT_SUPPORTED = "0A000" #:nodoc:
      :   796   
      :   797           def exec_no_cache(sql, binds)
      : > 798             @connection.async_exec(sql, [])
      :   799           end
      :   800   
      :   801           def exec_cache(sql, binds)
      :   802             stmt_key = prepare_statement sql
      :   803   
      : ```

此集成测试登录,然后来自前端(AngularJS)的许多调用以获取当前选择的公司等详细信息。这些调用中的每一个都会收到相同的消息,就像连接已关闭一样。我在 LIVE 模式下通过 selenium 和 capybara 使用 chrome 浏览器,所以我可以看到发生了什么。

这是我用于测试的 database.yml 文件

test: &test
  adapter: postgresql
  encoding: unicode
  database: test_<%= ENV['USER'] %><%= ENV['TEST_ENV_NUMBER'] %>
  pool: 5
  username: <%= ENV['DATABASE_USER'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>

这是它从前端发出的调用

AngularJS

  current_firm: (scope) ->
    $http({method: 'GET', url: '/companies/get_current_firm'}).success (data) ->
      scope.current_firm = data['firm']

导轨控制器

  def get_current_firm
    render json: {firm: current_firm.organisation}
  end

当用户登录时,有 3 个单独的调用来获取不同的数据,有时在测试中它会得到 1 或 2 个,但不会得到三个。

我尝试了http://www.ruby-railings.com/en/rails/postgresql/2014/01/11/connection-problems-in-rails-4.html的工作。这根本没有解决问题。

更新

当用户登录时,AngularJS 向 Rails 后端发出了三个 http 调用。如果我记下其中两个电话,那么该电话每次都有效。如果我只指出一个,所以我们有两个调用,那么它会失败一个或两个调用。我在其中一个电话上收到“待处理”消息。

4

1 回答 1

1

我一直认为这是一次向 Rails 4 发送太多请求的 AngularJS 问题。为了解决这个问题,我把每个电话都放在了一个承诺中。

于 2017-10-02T02:57:48.710 回答