He estado leyendo y leyendo y todavía estoy confundido sobre cuál es la mejor manera de compartir la misma conexión de base de datos (MongoDb) en toda la aplicación NodeJs. Según tengo entendido, la conexión debe estar abierta cuando se inicia la aplicación y reutilizarse entre módulos. Mi idea actual de la mejor manera es que server.js
(el archivo principal donde comienza todo) se conecta a la base de datos y crea una variable de objeto que se pasa a los módulos. Una vez conectada, esta variable será utilizada por el código de los módulos según sea necesario y esta conexión permanece abierta. P.ej:
var MongoClient = require('mongodb').MongoClient;
var mongo = {}; // this is passed to modules and code
MongoClient.connect("mongodb://localhost:27017/marankings", function(err, db) {
if (!err) {
console.log("We are connected");
// these tables will be passed to modules as part of mongo object
mongo.dbUsers = db.collection("users");
mongo.dbDisciplines = db.collection("disciplines");
console.log("aaa " + users.getAll()); // displays object and this can be used from inside modules
} else
console.log(err);
});
var users = new(require("./models/user"))(app, mongo);
console.log("bbb " + users.getAll()); // not connected at the very first time so displays undefined
entonces otro módulo se models/user
ve así:
Users = function(app, mongo) {
Users.prototype.addUser = function() {
console.log("add user");
}
Users.prototype.getAll = function() {
return "all users " + mongo.dbUsers;
}
}
module.exports = Users;
Ahora tengo la horrible sensación de que esto está mal, ¿hay algún problema obvio con este enfoque y, de ser así, cómo mejorarlo?
fuente
module.exports = mongoist(connectionString);
. (Lea sobre estoconnectionString
en el Manual de MongoDB.)Respuestas:
Puede crear un
mongoUtil.js
módulo que tenga funciones para conectarse a mongo y devolver una instancia de mongo db:Para usarlo, debe hacer esto en su
app.js
:Y luego, cuando necesite acceder a mongo en otro lugar, como en otro
.js
archivo, puede hacer esto:La razón por la que esto funciona es que en el nodo, cuando los módulos son
require
'd, solo se cargan / obtienen una vez, por lo que solo terminará con una instancia de_db
ymongoUtil.getDb()
siempre devolverá la misma instancia.Tenga en cuenta, código no probado.
fuente
app.js
dentro de la función de devolución de llamada deconnectToServer
. Sirequire
los configuraapp.js
antes_db
, obtendrá errores indefinidos en los otros módulos.var database = mongoUtil.getDb(); database.db().collection( 'users' )
.Hay muchas formas en que esto podría modificarse para aceptar objetos de configuración en algunos lugares, pero en general es similar a cómo tiene su código diseñado, aunque con una sintaxis JS más moderna. Podría reescribirse fácilmente en prototipos y devoluciones de llamada, si ese es su requisito.
mongo.js
Users.js
app.js
someFile.js
fuente
Así es como lo hago con sintaxis contemporánea, basado en el ejemplo de go-oleg. El mío está probado y es funcional.
Pongo algunos comentarios en el código.
fuente
Si está utilizando Express, puede utilizar el módulo express-mongo-db que le permite obtener una conexión db en el objeto de solicitud.
Instalar en pc
server.js
rutas / usuarios.js
fuente
go-oleg es básicamente correcto, pero en estos días (probablemente) no quieras usar "mongodb" en sí, sino usar algún marco, que hará mucho "trabajo sucio" por ti.
Por ejemplo, la mangosta es una de las más comunes. Esto es lo que tenemos en nuestro
server.js
archivo inicial :Esto es todo lo que se necesita para configurarlo. Ahora usa esto en cualquier lugar de tu código
Y obtienes esa instancia que configuraste con
mongoose.connect
fuente
Inicialice la conexión como una promesa:
Y luego llame a la conexión cada vez que desee realizar una acción en la base de datos:
fuente
Una solución probada basada en la respuesta aceptada:
mongodbutil.js:
app.js:
activities.js - una ruta:
fuente
Aquí está mi configuración en 2020:
./utils/database.js
/app.js
fuente
podemos crear un archivo dbconnection como dbconnection.js
y luego use este archivo en su aplicación como
y luego use así dentro de su función asincrónica
espero que esto funcione
fuente
Llego un poco tarde para esto, pero también agregaré mi solución. Es un enfoque mucho más novedoso en comparación con las respuestas aquí.
De todos modos, si está utilizando MongoDB versión 4.0 y Node.js 3.0 (o versiones superiores), puede usar la
isConnected()
función deMongoClient
.Esto funcionó bien para mi. Espero eso ayude.
fuente
Llego tarde a la fiesta, pero espero que esta respuesta ayude a alguien, este es un código funcional:
db.js
Exportamos una función para conectarnos al mongo y otra para obtener la instancia de la conexión.
app.js
Debemos hacer el requerimiento del módulo de autenticación después de inicializar la conexión, de lo contrario, la función getDb devolverá undefined.
module.js
fuente
Como está etiquetado con Express, pensé en mencionar que Express tiene una función incorporada para compartir datos entre rutas. Hay un objeto llamado app.locals. Podemos adjuntarle propiedades y acceder a él desde dentro de nuestras rutas. Simplemente crea una instancia de su conexión mongo en su archivo app.js.
Ahora se puede acceder a esta conexión de base de datos dentro de sus rutas como se muestra a continuación sin la necesidad de crear y requerir módulos adicionales.
Este método garantiza que tenga una conexión a la base de datos abierta mientras dure su aplicación, a menos que elija cerrarla en cualquier momento. Es de fácil acceso
req.app.locals.your-collection
y no requiere módulos adicionales.fuente
Si opta por usar mongoose en su aplicación, edite su archivo app.js con el siguiente fragmento
app.js
Siguiente paso: defina modelos para su aplicación, solicítelos y realice la operación CRUD directamente, por ejemplo
blogSchema.js
Uso createBlog.js
No es necesario que se conecte siempre a mogoDB ...
fuente
fuente
fuente
Encuentro que esto funciona bien :)
mongoUtil.ts
anyFile.ts
fuente
javascript
, no creo que una respuesta de TypeScript sea apropiada.