簡體   English   中英

MongoDB和React:db.find()關閉后返回undefined

[英]MongoDB & React : db.find() returns undefined after closing it

因此,當我第一次打開與數據庫的連接時,一切正常,但是當我關閉它並嘗試重新打開它時,db對象沒有給出錯誤,但返回了未定義的信息。

這是我打開連接的方法:

let conn = null;
let db = null;

async function validateLoginForm(payload, res) {
    const errors = {};
    let isFormValid = true;
    let message = '';

    if (!payload || typeof payload.email !== 'string' || payload.email.trim().length === 0) {
        if (payload.email !== 'anonymous') {
            isFormValid = false;
            errors.email = 'Please provide your email address.';
        }
    }

    if (!payload || typeof payload.password !== 'string' || payload.password.trim().length === 0) {
        if (payload.email !== 'anonymous') {
            isFormValid = false;
            errors.password = 'Please provide your password.';
        }
    }

    let stringConnection = payload.email === 'anonymous' ? 'mongodb://ds133221.mlab.com:33221/sandbox-te' : 'mongodb://' + payload.email + ':' +
        payload.password + '@ds133221.mlab.com:33221/sandbox-te';

    conn = await MongoClient.connect(stringConnection, await function(err, dbase) {
        if (err)
        {
            isFormValid = false;
            let errorMessage = 'Error connecting to DB';
            return res.status(400).json({
                success: false,
                message: errorMessage,
                errors: errors
            });
        }
        else
        {
            db = dbase;
            if (payload.email !== 'anonymous')
            {
                let roles = dbase.command({usersInfo: {user: payload.email, db: 'sandbox-te'}, showCredentials: true}, (err, result) => {
                    if (result.users[0] && result.users[0].roles[0] &&
                        (result.users[0].roles[0].role === 'dbOwner' || result.users[0].roles[0].role === 'readWrite'))
                    {
                        dbase.close();
                        return res.status(200).json({
                            success: true,
                            hasWriteRole: true
                        })
                    }
                });
            }
            else
            {
                return res.status(200).json({
                    success: true,
                    hasWriteRole: false
                })
            }
        }
    });
}

該文件的第一部分驗證登錄表單,第二部分使用電子郵件和密碼來嘗試打開與數據庫的連接。

整個功能運行良好,但是當我嘗試在另一個文件中將其重新打開時,它將無法正常工作:

router.post('/search', (req, res) => {

    db.open((err, dbase) => {
        let test = dbase.collection('test');
        console.log(test);
        let promiseOfFind = test.find({}).toArray((err, docs) => {
            console.log(docs);  // RETURNS UNDEFINED ONLY IF DB WAS CLOSED EARLIER
        })
    });
});

如果我沒有在validateLoginForm函數中關閉數據庫,則可以檢索文檔而不必再次打開它,但是我只是想實現這一點。

我的代碼有什么問題? 我對Java語言還很陌生,而針對Node.js的官方MongoDB驅動程序的API參考並沒有太大幫助。

我正在使用最新版本的React,Express,MongoDB Node.JS官方驅動程序,當然還有Node.JS

提前致謝 !

使用MongoDB,您應該打開一個連接並通過您的應用程序重新使用它。 您不需要那時的諾言。

因此在啟動時:

const connection = MongoClient.connect(stringConnection, function(err, dbase) {
  // Start web server
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM