MongoDB可以连接MongoClient但不能连接mongoose

Posted

技术标签:

【中文标题】MongoDB可以连接MongoClient但不能连接mongoose【英文标题】:MongoDB can be connected with MongoClient but not mongoose 【发布时间】:2022-01-23 19:02:39 【问题描述】:

所以当我在部署中运行我的应用程序时,后端使用 MongoClient 连接到 MongoDB,如下所示:

import  MongoClient  from 'mongodb'

const url = process.env.MONGODB_URI 

MongoClient.connect(url,  useNewUrlParser: true, useUnifiedTopology: true ,(err, db)=>
  console.log(url)
  db.close()
)

一切正常。但是如果我把它改成

import mongoose from 'mongoose'

mongoose.Promise = global.Promise
mongoose.connect(url,  useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true )
mongoose.connection.on('error', () => 
  throw new Error(`unable to connect to database: $url`)
)

它给出了以下错误:

webpack://HappyHourWeb/./server/server.js?:29
  throw new Error(`unable to connect to database: $_config_config__WEBPACK_IMPORTED_MODULE_0__["default"].mongoUri`)
   ^
Error: unable to connect to database: my_database_url,
    at NativeConnection.eval (webpack://HappyHourWeb/./server/server.js?:29:9)
    at NativeConnection.emit (node:events:390:28)
    at /Users/Hieudo/Documents/Project/HappyHourWeb/node_modules/mongoose/lib/connection.js:807:30
    at processTicksAndRejections (node:internal/process/task_queues:78:11)

非常感谢任何帮助!

【问题讨论】:

在您的第一个示例中,您从环境变量中获取 url,但在您的第二个示例中,未定义 url,这是有意的吗? 网址是否包含+srv,如果是,您使用的是支持它的猫鼬版本吗?查看 mongoose 文档中的 Error Handling 以了解如何记录发生的具体错误。 @GaëtanBoyals 我使用的是相同的网址。 @Joe 是的,我的网址包含 +srv。它的类型如下:“mongodb+srv://:@happyhour.vr5kw.mongodb.net/?retryWrites=true&w=majority”。 尝试使用等效的mongodb:// url。 【参考方案1】:

根据各种来源,包括MongoDB Connection String URI reference、Mongoose connection docs(Ctrl+F 并搜索srv 以跳转到正确的主题)和this question on SO 上最受好评的答案,您应该处理标准 URI 和 DNS URI 不同。

Mongoose 接受 dbName 选项

[...]如果您无法在连接字符串中指定默认数据库(例如某些 mongodb+srv 语法连接),则很有用。

原生 MongoDB 驱动程序自动处理它的事实并不一定意味着 Mongoose 会。尝试将 DB 名称与 URI 分开,并在与 Mongoose 连接时将其作为第二个参数传递。

另外,你的那部分代码:

mongoose.connection.on('error', () => 
  throw new Error(`unable to connect to database: $url`)
)

不检查连接错误,如果在初始连接建立之后遇到错误,它会发出一个事件。

正如 Joe 在 cmets 中指出的那样,您应该使用 try/catch 语法或 .catch 回调来处理初始连接错误和可能出现的错误。更多信息in the docs.

【讨论】:

以上是关于MongoDB可以连接MongoClient但不能连接mongoose的主要内容,如果未能解决你的问题,请参考以下文章

mongodb eclipse java.lang.ClassNotFoundException: com.mongodb.MongoClient

将MongoClient与列表ServerAddress一起使用时,com.mongodb.MongoTimeoutException

爬虫文件存储-2:MongoDB

pymongo方法详解

Python——连接MongoDB

MongoDB与Python的交互