J'ai lu et lu et je ne sais toujours pas quelle est la meilleure façon de partager la même connexion de base de données (MongoDb) sur toute l'application NodeJs. Si je comprends bien, la connexion doit être ouverte lorsque l'application démarre et réutilisée entre les modules. Mon idée actuelle du meilleur moyen est que server.js
(le fichier principal où tout commence) se connecte à la base de données et crée une variable objet qui est passée aux modules. Une fois connectée, cette variable sera utilisée par le code des modules si nécessaire et cette connexion reste ouverte. Par exemple:
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
alors un autre module models/user
ressemble à ça:
Users = function(app, mongo) {
Users.prototype.addUser = function() {
console.log("add user");
}
Users.prototype.getAll = function() {
return "all users " + mongo.dbUsers;
}
}
module.exports = Users;
Maintenant, j'ai horriblement l'impression que c'est faux, alors y a-t-il des problèmes évidents avec cette approche et si oui, comment l'améliorer?
la source
module.exports = mongoist(connectionString);
. (Lire à proposconnectionString
du manuel MongoDB.)Réponses:
Vous pouvez créer un
mongoUtil.js
module qui a des fonctions pour à la fois se connecter à mongo et renvoyer une instance de mongo db:Pour l'utiliser, vous le feriez dans votre
app.js
:Et puis, lorsque vous avez besoin d'accéder à mongo ailleurs, comme dans un autre
.js
fichier, vous pouvez le faire:La raison pour laquelle cela fonctionne est que dans node, quand les modules sont
require
'd, ils ne sont chargés / fournis qu'une seule fois, donc vous ne vous retrouverez jamais qu'avec une seule instance de_db
etmongoUtil.getDb()
retournerez toujours cette même instance.Remarque, code non testé.
la source
app.js
dans la fonction de rappel deconnectToServer
. Si vousrequire
les définissezapp.js
avant_db
, vous obtiendrez des erreurs non définies dans les autres modules.var database = mongoUtil.getDb(); database.db().collection( 'users' )
.Il existe de nombreuses façons de modifier cela pour accepter des objets de configuration à certains endroits, mais dans l'ensemble, c'est similaire à la façon dont vous disposez votre code, bien qu'avec une syntaxe JS plus moderne. Pourrait facilement être réécrit en prototypes et rappels, si tel est votre besoin.
mongo.js
Users.js
app.js
someFile.js
la source
Voici comment je le fais avec la syntaxe contemporaine, basée sur l'exemple de go-oleg. Le mien est testé et fonctionnel.
J'ai mis quelques commentaires dans le code.
la source
Si vous utilisez Express, vous pouvez utiliser le module express-mongo-db qui vous permet d'obtenir une connexion db dans l'objet de requête.
Installer
server.js
routes / users.js
la source
go-oleg a fondamentalement raison, mais de nos jours, vous ne voulez (probablement) pas utiliser "mongodb" lui-même, mais plutôt utiliser un framework, qui fera beaucoup de "sale boulot" pour vous.
Par exemple, la mangouste est l'une des plus courantes. Voici ce que nous avons dans notre
server.js
fichier initial :C'est tout ce dont vous avez besoin pour le configurer. Maintenant, utilisez ceci n'importe où dans votre code
Et vous obtenez cette instance que vous avez configurée
mongoose.connect
la source
Initialisez la connexion comme une promesse:
Et puis appelez la connexion chaque fois que vous souhaitez effectuer une action sur la base de données:
la source
Une solution testée basée sur la réponse acceptée:
mongodbutil.js:
app.js:
activities.js - un itinéraire:
la source
Voici ma configuration en 2020:
./utils/database.js
/app.js
la source
nous pouvons créer un fichier dbconnection comme dbconnection.js
puis utilisez ce fichier dans votre application comme
puis utilisez comme ceci dans votre fonction asynchrone
j'espère que cela fonctionnera
la source
Je suis un peu en retard pour cela, mais j'ajouterai aussi ma solution. C'est une approche beaucoup plus noble par rapport aux réponses ici.
Quoi qu'il en soit, si vous utilisez MongoDB version 4.0 et Node.js 3.0 (ou versions supérieures), vous pouvez utiliser la
isConnected()
fonction duMongoClient
.CA marchait bien pour moi. J'espère que ça aide.
la source
Je suis en retard à la fête, mais j'espère que cette réponse aidera quelqu'un, c'est un code fonctionnel:
db.js
Nous exportons une fonction pour se connecter au mongo et une autre pour obtenir l'instance de la connexion.
app.js
Nous devons faire l'exigence du module auth après avoir initialisé la connexion, sinon la fonction getDb retournera undefined.
module.js
la source
Comme cela est étiqueté avec Express, j'ai pensé mentionner qu'Express a une fonctionnalité intégrée pour partager des données entre les itinéraires. Il existe un objet appelé app.locals. Nous pouvons y attacher des propriétés et y accéder depuis l'intérieur de nos routes. Vous instanciez simplement votre connexion mongo dans votre fichier app.js.
Cette connexion à la base de données est désormais accessible dans vos itinéraires comme ci-dessous sans avoir besoin de créer et d'exiger des modules supplémentaires.
Cette méthode garantit que vous disposez d'une connexion à la base de données ouverte pendant toute la durée de votre application, sauf si vous choisissez de la fermer à tout moment. Il est facilement accessible
req.app.locals.your-collection
et ne nécessite pas de modules supplémentaires.la source
Si vous optez pour l'utilisation de la mangouste dans votre application, modifiez votre fichier app.js avec l'extrait suivant
app.js
Étape suivante: définir les modèles pour votre application, les exiger et effectuer l'opération CRUD directement par exemple
blogSchema.js
Utilisation createBlog.js
Vous n'avez pas besoin de toujours vous connecter à mogoDB ...
la source
la source
la source
Je trouve que cela fonctionne bien :)
mongoUtil.ts
anyFile.ts
la source
javascript
, ne pensez pas qu'une réponse TypeScript est appropriée.