【问题标题】:TypeError: Cannot read property 'db' of nullTypeError:无法读取 null 的属性“db”
【发布时间】:2020-01-01 21:49:13
【问题描述】:

我在连接 mongodb atlas 时遇到问题,出现以下错误

let express = require('express')
let mongodb = require('mongodb')
let app = express()
let db

let connectionString = 'mongodb+srv://olumide:xxxxxxxx@cluster0-edskm.mongodb.net/todoApp?retryWrites=true&w=majority'
mongodb.connect(connectionString, {useNewUrlParser: true, useUnifiedTopology: true}, function(err, client){
    db = client.db()
    app.listen(3000)
})

app.use(express.urlencoded({extended: false}))

app.post('/create-item', function(req,res){
   db.collection('item').insertOne({text: req.body.item}, function(){
    res.send("thanks for submitting the form")
   })

})

Error message

【问题讨论】:

  • 错误信息表示clientclient.db中为空——你检查过err是否有任何内容吗?
  • 请将错误发布为文本,而不是图像。

标签: node.js mongodb


【解决方案1】:

这是因为 mongo.connect 函数是异步的。您需要在 mongo.connect 回调中包含 app.post 函数。

类似这样的东西应该可以工作:

let express = require('express')
let mongodb = require('mongodb')
let app = express()

app.use(express.urlencoded({extended: false}))

let connectionString = 'mongodb+srv://olumide:xxxxxxxx@cluster0-edskm.mongodb.net/todoApp?retryWrites=true&w=majority'
mongodb.connect(connectionString, {useNewUrlParser: true, useUnifiedTopology: true}, function(err, client){
    const db = client.db()

    app.post('/create-item', function(req,res){
       db.collection('item').insertOne({text: req.body.item}, function(){
        res.send("thanks for submitting the form")
       })
    })

    app.listen(3000)
})

【讨论】:

    【解决方案2】:

    我发现,在较新版本的 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)框架的同时方便地使用它。

    【讨论】:

      【解决方案3】:

      使用猫鼬连接作为不同的javascript文件并将其导入到表达脚本文件 数据库.js

      let mongoose = require('mongoose');
      const server = '127.0.0.1:27017'; // REPLACE WITH YOUR DB SERVER
      const database = 'test';      // REPLACE WITH YOUR DB NAME
      class Database {
          constructor() {
            this._connect()
          }
          
        _connect() {
             mongoose.connect(`mongodb://${server}/${database}`,{ useUnifiedTopology: true ,useNewUrlParser: true, useFindAndModify: false})
               .then(() => {
                 console.log('Database connection successful')
               })
               .catch(err => {
                 console.error('Database connection error')
               })
          }
        }
        
        module.exports = new Database()

      强文本

      【讨论】:

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