文档菜单
文档首页
/ / /
Go 驱动

连接故障排除

本页内容

  • 连接错误
  • 检查连接字符串
  • 配置防火墙
  • 认证错误
  • 检查连接字符串
  • 验证认证机制
  • 验证用户是否在认证数据库中
  • 发送消息错误
  • 检查连接字符串
  • 验证认证机制
  • 验证用户是否在认证数据库中
  • 配置防火墙
  • 检查连接数
  • 超时错误
  • 设置超时选项
  • 检查连接数

本页提供了使用 MongoDB Go 驱动连接到 MongoDB 部署时可能遇到的问题的潜在解决方案。

注意

本页仅解决连接问题。如果您遇到 MongoDB 或驱动程序的其他问题,请访问以下资源

  • Go 驱动常见问题(FAQ)

  • 问题 & 帮助页面,其中包含有关报告错误、为驱动程序做出贡献和查找其他资源的信息

  • MongoDB社区论坛,用于提问、讨论或一般技术支持

以下错误消息是一个通用消息,表明驱动程序无法连接到指定主机名或端口的服务器

Error: couldn't connect to server 127.0.0.1:27017

以下部分描述了可能有助于解决问题的方法。

请确认连接字符串中的主机名和端口号都准确无误。在示例错误消息中,主机名是127.0.0.1,端口号是 27017。MongoDB实例的默认端口号是 27017,但您可以将MongoDB配置为在其他端口上通信。

假设您的MongoDB部署使用的是默认端口,请确认防火墙中端口 27017 已开放。如果您的部署使用的是不同的端口,请确认防火墙中正确的端口已开放。

警告

除非您确定它是MongoDB实例使用的端口,否则请勿在防火墙中打开端口。

如果Go驱动程序没有正确配置授权,它可能无法连接到MongoDB实例。在这种情况下,驱动程序会引发类似于以下消息之一的错误信息:

Command failed with error 18 (AuthenticationFailed): 'Authentication
failed.' on server localhost:27017.
connection() error occurred during connection handshake: auth error:
sasl conversation error: unable to authenticate using mechanism
"SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.

以下部分描述了可能有助于解决问题的方法。

无效的连接字符串是尝试连接到MongoDB时遇到身份验证问题的最常见原因。

提示

有关连接字符串的更多信息,请参阅连接指南中的连接URI

如果您的连接字符串包含用户名和密码,请确保它们格式正确。

注意

如果用户名或密码包含以下任何字符,则它们必须进行百分号编码:

: / ? # [ ] @

连接到副本集时,请在连接字符串中包含所有副本集主机。使用逗号分隔连接字符串中的每个主机。这使驱动程序能够在某个主机不可达时建立连接。

确保您的凭据和认证机制正确。您可以将认证凭据存储在环境变量中,或者将它们传递给 SetAuth() 方法。

了解更多关于认证的信息,请参阅认证机制指南。

要成功通过数据库用户名和密码认证连接,用户名必须在认证数据库中定义。默认认证数据库是 admin 数据库。要使用不同的数据库进行认证,请在连接字符串中指定 authSource。以下示例指示驱动程序使用 users 作为认证数据库

uri := "mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users"
client := mongo.Connect(context.TODO(), uri)

当驱动程序在您发出请求后无法发送命令时,通常会显示以下通用错误消息

com.mongodb.MongoSocketWriteException: Exception sending message

以下部分描述了可能有助于解决问题的方法。

验证您的应用程序中的连接字符串是否准确。有关验证连接字符串的更多信息,请参阅连接错误认证错误。

请确保您使用正确的认证机制和凭证。有关认证错误的更多信息,请参阅认证错误。

验证用户是否在正确的认证数据库中。有关认证数据库的更多信息,请参阅 认证错误。

防火墙必须为与MongoDB实例通信而打开端口。有关配置防火墙的更多信息,请参阅 连接错误。

每个 客户端 实例都支持连接池中的最大并发打开连接数。配置参数 maxPoolSize 定义此值,默认设置为 100。如果已经有等于 maxPoolSize 的打开连接数,则服务器会等待直到有连接变得可用。如果此等待时间超过 maxIdleTimeMS 值,则驱动程序会返回错误。有关连接池如何工作的更多信息,请参阅FAQ中的 Go驱动程序中连接池是如何工作的?

有时当你通过驱动器向服务器发送请求时,请求会超时。在这种情况下,你可能收到类似以下错误消息

timed out while checking out a connection from connection pool: context canceled

如果你收到这个错误,请尝试以下方法解决问题。

客户端 支持一个控制单个操作执行时间的 超时 选项。您可以使用 SetTimeout() 方法或通过在连接字符串中指定 timeoutMS 选项来设置此值。

以下示例使用连接字符串选项将单个超时值设置为 5 秒

uri := "mongodb://<db_username>:<db_password>@<hostname>:27017/?timeoutMS=5000"
client := mongo.Connect(context.TODO(), uri)

到服务器的连接数可能超过 maxPoolSize。有关检查连接数的更多信息,请参阅 发送消息错误。

返回

常见问题