2017-07-19 7 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の新機能であり、node.jsの公式MongoDBドライバのAPIリファレンスはあまり役に立たない。

Node.JSのReact、Express、MongoDB公式ドライバの最新バージョンを使用していますが、もちろん、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では、1つの接続を開いてアプリケーションから再利用する必要があります。あなたはあなたが持っている約束は必要ありません。起動時にそう

:あなたは「左側」の引数を持っているので、「約束」を求め

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

私は確かにこれをここで見た。私はそれを行うつもりだが、db.open()は実現するのが本当に不可能ですか?あなたのコメントをありがとう! :) –

+0

@ GaetanBoyalsあなたはおそらくそうかもしれませんが、ほとんどの人/モンゴ自身が 'MongoClient'を使用しているので、このアプローチを使用することは避けたいと思います。 Mongo – Ian

+0

が提供する無料のトレーニングコースについては、https://university.mongodb.com/courses/M101JS/aboutをご覧ください。アドバイスとリンクをお寄せいただきありがとうございます。 :D –

関連する問題