2017-07-19 66 views
-1

因此,當我第一次打開與數據庫的連接時,所有工作都正常,但是當我關閉它並嘗試重新打開它時,db對象沒有給出錯誤,但返回undefined ...MongoDB&React:db.find()在關閉它後返回undefined

以下是我打開的連接:

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函數,我可以檢索文檔而無需再次打開它,但我只是想實現此目的。

我的代碼有什麼問題?我很新的Javascript和官方的MongoDB驅動程序的API參考node.js沒有多大幫助..

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

在此先感謝!

+0

因爲你的「左側」的說法提出了「無極」。下決心如果你想要一個「承諾」或「回調」。 –

+0

另外,我不知道你在讀什麼,但是'db.open()'看起來像你試圖訪問一個不贊成使用的方法。連接應始終打開。 –

+0

閱讀:http://mongodb.github.io/node-mongodb-native/2.2/api/Db.html#open這是2.2驅動程序的官方文檔。我使用的是2.2.29。另外,你的第一條評論並沒有解決這個問題。 –

回答

1

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

因此在啓動時:

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

我的確在這裏和那裏看到了這一點。我打算這樣做,但db.open()真的不可能實現?儘管感謝您的評論! :) –

+0

@GaetanBoyals你可能會,但我會避免使用這種方法,因爲大多數人/ Mongo自己使用'MongoClient'。查看https://university.mongodb.com/courses/M101JS/about免費培訓課程,由Mongo提供 – Ian

+0

感謝您的建議和鏈接,非常有幫助! :d –