MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Express js, mongodb:ReferenceError:db не е дефиниран, когато 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('database.js'); в App.js. Не губите при първата заявка.

Като алтернатива можете да използвате promises , който се грижи за логиката на изчакване вместо вас.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Редовен израз Пролетни хранилища на данни mongodb

  2. Mongoose upsert дублиращ се ключ грешка

  3. Показване на условния размер на масив с другите полета на mongodb документ

  4. Ограничете вмъкванията в mongodb

  5. Mongoose намира последните десет записа в базата данни