sql >> データベース >  >> NoSQL >> MongoDB

Express js、mongodb:ReferenceError:dbがpost関数の外部で言及されている場合、dbは定義されていません

    MongoClient.connect()を覚えておいてください 非同期です。 var user=db.collection('user');を実行すると、データベース接続の準備ができていない可能性があります。 。データベース接続は、コールバックが実行されると、それより前に確立されました。

    最初の要求が行われると、データベース接続がたまたま確立されます。待つ時間が長くなるほど、それが機能する可能性が高くなりますが、それでも間違ったアプローチです。

    また、グローバル変数を操作することは悪い習慣であり、混乱を招き、その他の問題

    要するに、コードは次のようになります

    // module database.js
    var mongodb= require('mongodb');
    var MongoClient= mongodb.MongoClient;
    var URL = 'mongodb://127.0.0.1:27017/mainDB';
    
    var db;
    var error;
    var waiting = []; // Callbacks waiting for the connection to be made
    
    MongoClient.connect(URL,function(err,database){
      error = err;
      db = database;
    
      waiting.forEach(function(callback) {
        callback(err, database);
      });
    });
    
    module.exports = function(callback) {
      if (db || error) {
        callback(error, db);
      } else {
        waiting.push(callback);
      }
    }
    }
    

    のように使うより

    var db = require('database.js');
    
    router.post('/',function(req,res,next){
      username=req.body.username;
      password=req.body.password;
    
      db.conn(function(err, database) {
        if (err) {
          res.sendStatus(500);
          console.log(err);
          return;
        }
    
        database.collection('users').findOne({'username':username, 'password':password}, function(err, docs){
          //do something
        });
      });
    });
    

    接続は最初のrequireで行われるため、require('database.js');を追加すると App.jsで。最初のリクエストでを失うことはありません。

    または、約束 を使用することもできます。 、待機ロジックを処理します。



    1. Django ValueError:パス'ws /chat//'のルートが見つかりません

    2. ローカルのmongodbを起動/起動できません

    3. NodeJSとMongoDBでWebサイトをホストする方法は?そして、費用はいくらですか?

    4. MongoDBを使用した単純なタグ付けの実装