TypeError: невозможно прочитать свойство db of undefined при попытке использования Mongodb Atlas Online - PullRequest
0 голосов
/ 11 июля 2020

[nodemon] запуск node server.js C: \ Users \ Abhay \ Desktop \ todo-app \ node_modules \ mongodb \ lib \ utils. js: ошибка выброса 725; ^

TypeError: невозможно прочитать свойство 'db' неопределенного в C: \ Users \ Abhay \ Desktop \ todo-app \ server. js: 8: 17 в C: \ Users \ Abhay \ Desktop \ todo-app \ node_modules \ mongodb \ lib \ utils. js: 722: 9 в C: \ Users \ Abhay \ Desktop \ todo-app \ node_modules \ mongodb \ lib \ mongo_client. js : 223: 23 в C: \ Users \ Abhay \ Desktop \ todo-app \ node_modules \ mongodb \ lib \ operations \ connect. js: 279: 21 в QueryReqWrap.callback (C: \ Users \ Abhay \ Desktop \ todo-app \ node_modules \ mongodb \ lib \ core \ uri_parser. js: 56: 21) в QueryReqWrap.onresolve [as oncomplete] (dns. js: 202: 10) [nodemon] приложение упало - ожидание изменений файла перед запуском ...

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

let connectionString = 'mongodb+srv://todoAppUser:kTL7PYesKzfB6FMz@cluster0.fif5n.mongodb.net/TodoApp?retryWrites=true&w=majority'
mongodb.connect(connectionString, {useNewUrlParser: true, useUnifiedTopology: true}, function(err, client) {
    db = client.db()
    app.listen(3000)
})

1 Ответ

1 голос
/ 11 июля 2020

Кажется, вы пытаетесь использовать метод stati c connect of MongoClient для подключения к своей базе данных, но вы не используете сам класс MongoClient.

Для подключения к любой базе данных вам понадобится подключенный экземпляр MongoClient. Используя метод stati c connect, вы можете добиться этого следующим образом:

const mongodb = require("mongodb");


const connectionURL = "mongodb+srv://your-connection-srv-here"
const dbName = "your_db_name"

//get MongoClient
const MongoClient = mongodb.MongoClient;

let db = null;

MongoClient.connect(connectionURL,{
    useNewUrlParser: true,
    useUnifiedTopology: true
},(err,connectedClient) => {
    if(err){
        throw err;
    }
    //connectedClient will be the connected instance of MongoClient
    db = connectedClient.db(dbName);
    //now you can write queries

    db.collection("your_collection").find({}).toArray()
    .then(r => {
        console.log(r);
    }).catch(e => {
        console.error(`ERROR:`,e);
    })

})

Однако использование обратных вызовов будет довольно громоздким. Согласно приведенным выше документам, большинство функций в драйвере MongoDb для Node.js вернут обещание , если функция обратного вызова не передана, что очень удобно. Используя это, вы можете написать функцию, которая возвращает обещание, которое разрешает подключенный экземпляр к вашей базе данных.

const MongoClient = require('mongodb').MongoClient;


/*
    we draw the connection srv and the db name from the config to return just one instance of that db.
    Now this function call be called wherever a connection is needed
*/
const getDbInstance = (config) => new Promise((resolve,reject) => {
    const client = new MongoClient(config.dbUrl, {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
    client.connect((error) => {
        if(error){
            console.error(error);
            reject(error);
        }
        let db = client.db(config.dbName);
        resolve(db);
    })
})


const doSomeDbOperations = async() => {
    //hardcoding it here, but this config will probably come from environment variables in your project
    const config = {
        dbUrl: "mongodb+srv://your-connection-srv-here",
        dbName: "your_db_name"
    };

    try{
        const db = await getDbInstance(config);

        //do whatever querying you wish here

    }catch(e){
        console.error(`ERROR: `,e);
    }

}

doSomeDbOperations();
...