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

Zachowanie wymagania w node.js

Należy tutaj zrozumieć 3 kluczowe punkty, a następnie wyjaśnię je szczegółowo.

  1. module.exports to obiekt, a obiekty są przekazywane przez kopię odniesienia w JavaScript.
  2. wymaganie jest synchronicznym funkcja.
  3. client.connect jest asynchronicznym funkcja.

Jak sugerowałeś, to kwestia czasu. node.js nie może wiedzieć, że module.exports zmieni się później. To nie jest problem. Skąd miałby o tym wiedzieć?

Kiedy require uruchamia, znajduje plik, który spełnia jego wymagania na podstawie wprowadzonej ścieżki, odczytuje go i wykonuje oraz buforuje moduł module.exports, aby inne moduły mogły require ten sam moduł i nie trzeba go ponownie inicjować (co mogłoby zepsuć zakres zmiennych itp.)

client.connect jest asynchronicznym wywołaniem funkcji, więc po jej wykonaniu moduł kończy wykonywanie, a require call przechowuje kopię referencji module.exports i zwraca ją do users.js. Następnie ustawiasz module.exports = db , ale jest za późno. Zamieniasz referencję module.exports na referencję do db, ale eksport modułu w węźle require cache wskazuje na stary obiekt.

Lepiej jest zdefiniować module.exports jako funkcję, która uzyska połączenie, a następnie przekaże je do funkcji zwrotnej w następujący sposób:

var mongodb = require("mongodb");
var client = mongodb.MongoClient;

module.exports = function (callback) {
    client.connect('mongodb://host:port/dbname', { auto_reconnect: true },
          function(err, db) {
             if (err) {
                console.log(err);
                callback(err);
             } else {
                // export db as member of exports
                callback(err, db);
             }
          }
    )
};

Ostrzeżenie:chociaż wykracza to poza zakres tej odpowiedzi, bądź bardzo ostrożny z powyższym kodem, aby upewnić się, że prawidłowo zamykasz/zwracasz połączenia, w przeciwnym razie wyciekniesz z połączeń.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Błąd bazy danych MongoDB:zniknęła baza danych

  2. Mongo podaje błąd klucza dupleksowego dla pól z unikalnym:false

  3. Mongoose zwraca [Object] zamiast faktycznego osadzonego dokumentu

  4. Jak liczyć wystąpienia w zagnieżdżonym dokumencie w mongodb?

  5. jak mogę przepisać moje zapytanie z mangusty po podzieleniu danych z jednego modelu na dwa?