文档菜单
文档首页
/ / /
Ruby MongoDB 驱动
/

常见错误

本页内容

  • 没有可用的服务器匹配偏好
  • OperationFailure 在使用认证读取 local 数据库时
  • SocketTimeoutError 和在 EC2 上的名称解析错误
  • Mongo::Auth::Unauthorized 用户无权访问

如果您收到以下错误

> client[:contacts].insert_one({ vpa: 'cool@cool'})
Mongo::Error::NoServerAvailable: No server is available matching preference: #<Mongo::ServerSelector::Primary:0x14987080 tag_sets=[] max_staleness=nil> using server_selection_timeout=30 and local_threshold=0.015
from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/server_selector/selectable.rb:115:in `select_server'
from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/cluster.rb:246:in `next_primary'
from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/retryable.rb:150:in `legacy_write_with_retry'
from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/retryable.rb:103:in `write_with_retry'
from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/collection.rb:422:in `block in insert_one'
from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/client.rb:485:in `with_session'
from /rvm/gems/ruby-2.4.2/gems/mongo-2.5.0/lib/mongo/collection.rb:421:in `insert_one'
from (irb):6
from /rvm/rubies/ruby-2.4.2/bin/irb:11:in `<main>'

该错误在 Ruby 驱动程序版本 2.6.x 及更早版本中产生。当驱动程序无法连接到服务器时,会引发此错误。为了解决这个问题,您可以尝试以下操作

  • 将驱动程序更新到最新的 2.x 版本。

  • 确保在 URI/连接字符串或主机列表中端口号码正确。

  • 如果您正在连接到 Atlas,请确保已正确配置防火墙规则。请参阅有关集群安全.

  • 如果您使用的应用程序是支持分叉的 Web 服务器,请参阅有关分叉.

有关此问题的更多信息,请参阅此处:RUBY-1281

如果在尝试读取 local 数据库时遇到以下错误

Mongo::Error::OperationFailure: not authorized on local to execute command { find: "oplog.rs", filter: { ts:
{ $gte: Timestamp 1497449043000|0 } }, sort: { $natural: 1 } } (13)

您可以通过调整用户角色并确保其具有对本地数据库的权限来解决这个问题。如果您特别想访问 oplog,也可以创建一个具有读取本地数据库的 oplog.rs 集合权限的自定义角色。更多关于角色管理的信息,请参阅此处

关于此问题的更多信息,请参阅MONGOID-4446

一些用户报告遇到了以下错误

Exception
Mongo::Error::SocketTimeoutError
Error
execution expired
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:57:in `pack_sockaddr_in'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:57:in `block (2 levels) in connect!'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket.rb:199:in `handle_errors'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:57:in `block in connect!'
/usr/lib/ruby/2.3.0/timeout.rb:101:in `timeout'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/socket/ssl.rb:56:in `connect!'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/address.rb:172:in `connect_socket!'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/server/connection.rb:86:in `connect!'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/server/connectable.rb:84:in `ensure_connected'
/var/lib/gems/2.3.0/gems/mongo-2.5.0/lib/mongo/server/connection.rb:256:in `write'

这个错误最后是在 Ruby 驱动程序版本 2.5.1 上报告的,因此更新驱动程序可能可以解决此问题。有用户报告说他们这样解决了这个问题

EC2 上的 DNS 服务器默认在 /etc/resolv.conf 中生成。按照这个答案 和设置名称服务器为 Google NS,我能够解决这个问题。

您可以在以下位置找到有关此问题的更多信息: MONGOID-4527.

一些用户报告遇到了以下错误

Mongo::Auth::Unauthorized: User ... is not authorized to access ...

在升级到 Ruby 驱动程序版本 2.5+ 后,驱动程序默认改为使用 scram 认证机制。如果用户创建时使用的认证机制与驱动程序使用的认证机制不匹配,则可能会发生此错误。您可以通过在 mongoid.yml 文件中指定 auth_mech 选项来指定首选的认证机制。

有关此问题的更多信息,请参阅此处:RUBY-1684

返回

Ruby 驱动程序快速入门