sql >> Base de Datos >  >> NoSQL >> MongoDB

Comportamiento de require en node.js

Hay 3 puntos clave para entender aquí y luego los explicaré en detalle.

  1. module.exports es un objeto y los objetos se pasan por copia de referencia en JavaScript.
  2. require es un sincrónico función.
  3. client.connect es un asincrónico función.

Como usted sugirió, es una cuestión de tiempo. node.js no puede saber que module.exports va a cambiar más adelante. Ese no es su problema. ¿Cómo podría saber eso?

Cuando require se ejecuta, encuentra un archivo que cumple con sus requisitos en función de la ruta que ingresó, lo lee y lo ejecuta, y almacena en caché module.exports para que otros módulos puedan require el mismo módulo y no tener que reinicializarlo (lo que estropearía el alcance variable, etc.)

client.connect es una llamada de función asíncrona, por lo que después de ejecutarla, el módulo finaliza la ejecución y require call almacena una copia de la referencia module.exports y la devuelve a users.js. Luego configura module.exports = db , pero es muy tarde. Está reemplazando la referencia module.exports con una referencia a db, pero la exportación del módulo en el nodo require el caché apunta al objeto antiguo.

Es mejor definir module.exports como una función que obtendrá una conexión y luego la pasará a una función de devolución de llamada así:

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

Advertencia:aunque está fuera del alcance de esta respuesta, tenga mucho cuidado con el código anterior para asegurarse de cerrar/devolver las conexiones correctamente, de lo contrario perderá conexiones.