sql >> Databáze >  >> NoSQL >> MongoDB

Express js,mongodb:ReferenceError:db není definováno, když je db zmíněno mimo funkci příspěvku

Pamatujte na MongoClient.connect() je asynchronní. Připojení k databázi nemusí být připraveno v době, kdy provedete var user=db.collection('user'); . Spojení s databází bylo vytvořeno po provedení zpětného volání, ne dříve.

Po provedení prvního požadavku se právě naváže připojení k databázi. Čím déle budete čekat, tím je pravděpodobnější, že to funguje, ale stále je to špatný přístup.

Také práce s globálními proměnnými je špatný postup a vede ke zmatkům a jiné problémy .

Stručně řečeno, kód by měl vypadat takto

// 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);
  }
}
}

Pak to použijte jako

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
    });
  });
});

Všimněte si, že připojení je vytvořeno na prvním požadavku, takže pokud přidáte require('database.js'); v App.js. Na první žádost neztratíte.

Případně můžete použít promises , který se za vás postará o logiku čekání.



  1. MongoDB, aktualizujte pole kolekce, pokud nová hodnota není null

  2. Odeslání do ObjectId se nezdařilo pro hodnotu 586cc8b3ea780c071bbe2469 na cestě _id pro uživatele modelu

  3. Jak nakonfigurovat SELinux pro sady replik MongoDB

  4. Propojení kontejneru Redis s jiným kontejnerem (Docker)