sql >> Database >  >> NoSQL >> MongoDB

Express js, mongodb:ReferenceError:db is niet gedefinieerd wanneer db wordt vermeld buiten de post-functie

Onthoud MongoClient.connect() is asynchroon. De databaseverbinding is mogelijk niet gereed op het moment dat u dit doet var user=db.collection('user'); . De databaseverbinding is gemaakt zodra de callback is voltooid, niet eerder dan dat.

Wanneer het eerste verzoek is gedaan, wordt de databaseverbinding toevallig tot stand gebracht. Hoe langer je wacht, hoe groter de kans dat het werkt, maar toch is het de verkeerde aanpak.

Ook werken met globale variabelen is een slechte gewoonte en leidt tot verwarring en andere problemen .

In het kort zou de code eruit moeten zien

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

Gebruik het dan als

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

Merk op dat de verbinding tot stand wordt gebracht op de eerste vereiste, dus als u require('database.js'); toevoegt in App.js. Je verliest de op het eerste verzoek niet.

Als alternatief kunt u beloften gebruiken , die de wachtlogica voor u regelt.



  1. Hoe kan ik in Meteor.js twee ontwikkelingsprojecten dezelfde Mongo-instantie laten gebruiken?

  2. Diagnose stellen van onverwachte redis-serverfout

  3. AWS-beheer:30% besparen op uw MongoDB-hostingkosten

  4. Verbinding met MongoDB controleren