错误 -- :在 Google 地理编码调用期间发现错误:SSL_connect SYSCALL 返回=5 errno=0 state=SSLv2/v3 read server hello A

ERROR -- : Caught an error during Google geocoding call: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A

我正在尝试在我的模型中输入坐标时获取地址。

 def full_address
    Geocoder.address("#{self.latlon.x}, #{self.latlon.y}")
  end

但是,有时它工作得很好,有时我会收到此错误。我到处寻找解决方案,但 none 适用于我。

warning: constant Geokit::Geocoders::Geocoder::TimeoutError is deprecated
E, [2016-11-15T17:06:32.828481 #7406] ERROR -- : Caught an error during Google geocoding call: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A
E, [2016-11-15T17:06:32.828665 #7406] ERROR -- : /Users/Brandon/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock'

我不打算发表评论,但没有人发布任何内容。由于您的特定错误消息包含 SSL 警告,我会检查您是否需要明确要求 openssl and/or 您的 openssl 设置是否正确。尽管堆栈跟踪有点不同,但我的应用程序中的地理编码超时也遇到了类似的问题。地理编码需要很长时间才能完成(例如因为地址真的很奇怪)但我的其余代码仍在继续。我认为堆栈跟踪是 Geokit 中的一个错误。由于您无法控制这个 运行 的速度,因此您应该首先考虑做一些事情来减少您进行此调用的次数,因此至少:

def full_address
  @full_address ||= Geocoder.address("#{self.latlon.x}, #{self.latlon.y}")
end

您还应考虑将 full_address 存储为计算字段,因为每次首次访问该模型实例时,上述代码仍将 运行。所以去掉上面的代码,而是添加一个 full_address 字段和一个 before save hook:

在迁移文件中:

add_column :models, :full_address, :string

在你的 model.rb:

before_save :geocode_address

def geocode_address
  self.full_address = Geocoder.address("#{self.latlon.x}, #{self.latlon.y}") if self.changed.include?("latlon")
end

这样,当 latlon.x 和 latlon.y 变量更新时调用仅 运行s,而不是每次访问地址时调用。