MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Express js,mongodb:ReferenceError:db nie jest zdefiniowany, gdy db jest wymienione poza funkcją post

Zapamiętaj MongoClient.connect() jest asynchroniczna. Połączenie z bazą danych może nie być gotowe w momencie wykonywania var user=db.collection('user'); . Połączenie z bazą danych zostało nawiązane zaraz po wykonaniu wywołania zwrotnego, nie wcześniej.

Po wykonaniu pierwszego żądania połączenie z bazą danych zostaje nawiązane. Im dłużej czekasz, tym większe prawdopodobieństwo, że to działa, ale nadal jest to złe podejście.

Również praca ze zmiennymi globalnymi jest złą praktyką i prowadzi do zamieszania i inne problemy .

W skrócie kod powinien wyglądać tak

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

Niż używaj go jak

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

Zauważ, że połączenie jest nawiązywane na pierwszym wymaganiu, więc jeśli dodasz require('database.js'); w App.js. Nie tracisz przy pierwszej prośbie.

Alternatywnie możesz użyć obietnice , który zajmuje się logiką oczekiwania za Ciebie.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoError:nie udało się połączyć z serwerem przy pierwszym połączeniu

  2. Jaka jest różnica między findAndModify a aktualizacją w MongoDB?

  3. Jak napisać pustą tablicę asocjacyjną ({}) do MongoDB z PHP

  4. Mangusta:Sortuj alfabetycznie

  5. Skrypt MongoDB do tworzenia kopii zapasowej replikacji ustawionej lokalnie na Windows Server