【问题标题】:MongoDB Node.js TypeError: Cannot read property 'db' of nullMongoDB Node.js TypeError:无法读取 null 的属性“db”
【发布时间】:2023-03-22 19:06:01
【问题描述】:

我正在为我的项目创建一个数据库,但是在这段代码中:

function getallvideos(callback) {
  MongoClient.connect(url, function(err, client) {
    const db = client.db("cathub")
    db.collection("videos", function(err, collection) {
      collection.find().toArray(function(err, res) {
        callback(res)
      })
    })
    db.close()
  })
}

我收到此错误:

TypeError: 无法读取属性 'db' of null

【问题讨论】:

  • 您永远不会在连接时检查错误
  • 控制台记录错误。一定是连接有问题。
  • 你试过MongoClient.open() 吗?

标签: javascript node.js mongodb


【解决方案1】:

如上所述,您需要记录连接错误。一旦你这样做了,你就会知道连接问题是什么!还要确保您的 URL 中存在 DB 名称!

function getallvideos(callback) {
     MongoClient.connect(url, function(err, client) {
           if (err) {
               console.error('An error occurred connecting to MongoDB: ', err);
           } else {
               const db = client.db("cathub")
               db.collection("videos", function (err, collection) {
                    collection.find().toArray(function(err, res) {
                                 callback(res)
                    })
               })
               db.close()
           }
     })
}

我也会处理访问视频收藏的错误,从长远来看,这将是最好的!

【讨论】:

    【解决方案2】:
    const DB_URL = 'mongodb+srv://yourUser:yourPassword@yourCluster.mongodb.net/'
    const DB_NAME = 'someDBName'
    const DB_COLLECTION_NAME = 'someCollectionName'
    
    
    const getData = async () => {
        const client = await MongoClient.connect(DB_URL, {
            useUnifiedTopology: true
        }).catch((err) => {
            console.log(err)
        })
    
        if (!client) {
            return []
        }
    
        try {
            const db = client.db(DB_NAME)
            const collection = db.collection(DB_COLLECTION_NAME)
            const res = await collection.find().toArray()
            return res
            // console.log(res)
        } catch (err) {
            return err
            // console.log(err)
        } finally {
            client.close()
        }
    }
    
    
    getData()
        .then((data) => {
            console.log(data)
    
        })
        .catch((err) => {
    
            console.log(err)
        })
    
    
    
    

    【讨论】:

    • 您好,欢迎来到 StackOverFlow,请提供有关您的代码的最低限度的详细信息。例如,问题是什么?或者为什么你的答案可以解决这个问题。
    • 欢迎来到 Stack Overflow。 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释此代码的作用以及它如何回答问题,以便它对 OP 以及其他有类似问题的用户有用。
    【解决方案3】:

    我发现,在较新版本的 MongoDB(3 及更高版本)中,它们从根本上改变了将节点服务器连接到数据库的方式。为了建立一个可重用的连接(以便我们可以从任何其他文件访问连接的数据库),我在我的 db.js 文件中创建了一个异步函数,在该文件中建立了连接,然后将其导出。在文件的末尾,我调用了该函数。代码如下:

    const {MongoClient} = require('mongodb')
    
    
    const client = new MongoClient('mongodb+srv://todoAppUser:<password>@cluster0.6lvjr.mongodb.net/myDatabase?retryWrites=true&w=majority')
    
    async function start(){
      await client.connect()
      console.log("Connected")
      module.exports = client.db()
      const app = require('./app')
      app.listen(3000)
    }
    
      start()
    

    从另一个文件调用它时:

    const productCollection = require('./db').collection("product");
    

    这段代码没有给我任何错误,并且工作得很好。借助上述代码,可以在遵循 MVC(Model-View-Controller)框架的同时方便地使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-11
      • 2020-01-29
      • 1970-01-01
      • 2022-01-12
      • 2021-12-04
      • 2021-12-17
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多