开发者问题收集

Mongodb客户端连接TypeError NULL问题

2018-12-22
2326

使用 Mongodb 开发一个简单的 nodejs express 应用程序。当我尝试使用返回的连接对象时,我收到一个 typeerror 无法从 null 读取。连接对象不为 null,因此我不清楚错误消息实际上试图指出什么。

生成错误的代码行是:

const silos = conn.db('toolkit').collection('silos')

我在 console.log("Connection: ",conn) 之前有一个调试 console.log

我正在检查连接回调中的错误,错误为 null。在此问题出现之前,我遇到了连接和用户名/身份验证方面的问题,因此我知道错误检查工作正常,因为它会在错误登录时触发。

错误是:

TypeError: Cannot read property 'db' of null
    at mongoClient.connect (/var/projects/drake/Routes/Silos.js:22:28)
    at err (/var/projects/drake/node_modules/mongodb/lib/utils.js:415:14)
    at executeCallback         (/var/projects/drake/node_modules/mongodb/lib/utils.js:404:25)
    at executeOperation (/var/projects/drake/node_modules/mongodb/lib/utils.js:422:7)
    at MongoClient.connect (/var/projects/drake/node_modules/mongodb/lib/mongo_client.js:168:10)
    at getSilos (/var/projects/drake/Routes/Silos.js:18:17)
    at Layer.handle [as handle_request] (/var/projects/drake/node_modules/express/lib/router/layer.js:95:5)
    at next (/var/projects/drake/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/var/projects/drake/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/var/projects/drake/node_modules/express/lib/router/layer.js:95:5)

console.log 行生成此消息:

Connection:  MongoClient {

这是我用于 Mongo 连接的代码。它位于一个文件中,并且导出了 MongoClient 对象,该对象在其他文件中用于连接到数据库。

const url = `mongodb://${process.env.MONGO_HOST}:${process.env.MONGO_PORT}`
const opts = {
    useNewUrlParser: true,
    authMechanism: process.env.MONGO_MECH,
    authSource: process.env.MONGO_SRC,
    auth: {
        user: process.env.MONGO_USER,
        password: process.env.MONGO_PWD
    }
}
const mongoClient = require('mongodb').MongoClient;
const objectID = require('mongodb').ObjectID
const mongo = new mongoClient(url,opts)

module.exports.mongoClient = mongo

这是我提取该代码并调用连接的地方。 导入代码:

const { mongoClient } = require('../mongo')

使用导入的代码:

mongoClient.connect( (err, conn) => {
        if (err) err(res,err, "Database Connection Error", 500)
        console.log("Connection: ",conn)
        const silos = conn.db('toolkit').collection('silos')

最后一行是出现错误的行。

console.log 的结果

Connection:  MongoClient {
3个回答

造成这种情况的一个常见原因是,在实际建立连接之前,您尝试与 mongodb 服务器进行交互。我可能错了,但我怀疑您可能以错误的顺序调用了数据库操作。为避免这种情况,请确保在对集合运行查询之前已成功连接到 mongodb 服务器。如果您使用的是 mongoose,那么

mongoose.connect('/a/valid/mongo/uri') 

将使

mongoose.connection

成为可以交互的有效对象。

您能否使用您的连接处理代码更新您的问题?

shanks
2018-12-23

不知道这是怎么回事。

我很感谢大家对我的反馈。

我花了一个周末的时间从头开始重写代码,这次成功了。我相信我做了同样的事情。一定是我忽略了一个拼写错误。

Jeremy Hawkins
2019-01-04

无论如何,我想分享一下我遇到这个问题的经历。我使用 Mongoose 建立连接,但它会在“副本集”或“身份验证错误”上崩溃。最终,我决定像您一样改用 MongoClient。这是因为 “如果您使用未连接的模型,Mongoose 默认不会抛出任何错误。”

改用 Mongo 后,连接错误也返回了“null”。我搜索了又搜索,尝试了几种方法,包括复制您的代码并添加“auth”选项等。我最终切换回了 Mongoose(尽管这对我解决问题没有影响),并执行了以下操作:

  1. 创建一个具有 ReadWrite 能力的新用户(没有立即帮助,但 绝对 需要,因为在没有正确的“新”用户的情况下部署到 Heroku 时会出现错误。)。我的 MongoDB 帐户中现在有 两个 个用户。

  2. 将以下内容添加到我的(Mongoose)架构中:

///Already had this:
let testSchema = new Schema {
      foo: String,
      bar: Number
      }

///Added:
 ,{
        bufferCommands: false,
        autoCreate: false
    });
  1. 由于数据库仍然为空,我在创建模型后添加了以下代码。
///Already had this:
let Test = mongoose.model('Test', testSchema);

///Added:
Test.createCollection();

我相信它随后“真正”启动了收集。在 mongo shell 中,我知道集合只有在其中有项目时才可见。现在 app.js 在启动时没有崩溃,我设法使用 HTML 中的表单将文档添加到数据库,并且成功了。我现在有一个连接到我的应用程序的工作数据库。希望这可以帮助任何人访问此页面。

daritimm
2020-06-30