Ich habe gelesen und gelesen und bin immer noch verwirrt darüber, wie ich dieselbe Datenbankverbindung (MongoDb) am besten für die gesamte NodeJs-App freigeben kann. Soweit ich weiß, sollte die Verbindung offen sein, wenn die App gestartet und zwischen Modulen wiederverwendet wird. Meine derzeitige Idee des besten Weges ist, dass server.js
(Hauptdatei, in der alles beginnt) eine Verbindung zur Datenbank hergestellt und eine Objektvariable erstellt wird, die an Module übergeben wird. Sobald die Verbindung hergestellt ist, wird diese Variable nach Bedarf vom Modulcode verwendet, und diese Verbindung bleibt offen. Z.B:
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
dann models/user
sieht ein anderes Modul so aus:
Users = function(app, mongo) {
Users.prototype.addUser = function() {
console.log("add user");
}
Users.prototype.getAll = function() {
return "all users " + mongo.dbUsers;
}
}
module.exports = Users;
Jetzt habe ich das schreckliche Gefühl, dass dies falsch ist. Gibt es also offensichtliche Probleme mit diesem Ansatz und wenn ja, wie kann ich ihn verbessern?
quelle
module.exports = mongoist(connectionString);
. (Lesen Sie mehr darüberconnectionString
im MongoDB-Handbuch.)Antworten:
Sie können ein
mongoUtil.js
Modul erstellen , das Funktionen zum Herstellen einer Verbindung mit Mongo und zum Zurückgeben einer Mongo-Datenbankinstanz enthält:Um es zu verwenden, würden Sie dies in Ihrem tun
app.js
:Und wenn Sie dann wie in einer anderen
.js
Datei Zugriff auf Mongo an einem anderen Ort benötigen , können Sie dies tun:Der Grund, warum dies funktioniert, ist, dass Module im Knoten
require
nur einmal geladen / bezogen werden, sodass Sie immer nur eine Instanz von erhalten_db
undmongoUtil.getDb()
immer dieselbe Instanz zurückgeben.Hinweis: Code nicht getestet.
quelle
app.js
die Rückruffunktion von importiert werdenconnectToServer
. Wenn Sierequire
sieapp.js
zuvor_db
festgelegt haben, werden in den anderen Modulen undefinierte Fehler angezeigt.var database = mongoUtil.getDb(); database.db().collection( 'users' )
.Es gibt viele Möglichkeiten, dies zu optimieren, um Konfigurationsobjekte an bestimmten Stellen zu akzeptieren. Insgesamt ähnelt es jedoch der Anordnung Ihres Codes, wenn auch mit modernerer JS-Syntax. Könnte leicht in Prototypen und Rückrufe umgeschrieben werden, wenn dies Ihre Anforderung ist.
mongo.js
Users.js
app.js.
someFile.js
quelle
Hier ist, wie ich es mit zeitgenössischer Syntax mache, basierend auf dem Beispiel von go-oleg. Meins ist getestet und funktionsfähig.
Ich habe einige Kommentare in den Code eingefügt.
quelle
Wenn Sie Express verwenden, können Sie das Express-Mongo-DB- Modul verwenden, mit dem Sie eine Datenbankverbindung im Anforderungsobjekt herstellen können.
Installieren
server.js
routen / users.js
quelle
go-oleg ist im Grunde richtig, aber in diesen Tagen möchten Sie (wahrscheinlich) nicht "mongodb" selbst verwenden, sondern ein Framework verwenden, das viel "schmutzige Arbeit" für Sie erledigt.
Zum Beispiel ist Mungo einer der häufigsten. Dies ist, was wir in unserer ursprünglichen
server.js
Datei haben:Dies ist alles, was zum Einrichten erforderlich ist. Verwenden Sie dies jetzt an einer beliebigen Stelle in Ihrem Code
Und Sie erhalten die Instanz, mit der Sie eingerichtet haben
mongoose.connect
quelle
Initialisieren Sie die Verbindung als Versprechen:
Rufen Sie dann die Verbindung auf, wann immer Sie eine Aktion für die Datenbank ausführen möchten:
quelle
Eine getestete Lösung basierend auf der akzeptierten Antwort:
mongodbutil.js:
app.js:
activity.js - eine Route:
quelle
Hier ist mein Setup im Jahr 2020:
./utils/database.js
/app.js
quelle
Wir können eine dbconnection-Datei wie dbconnection.js erstellen
und dann benutze diese Datei in deiner App wie
und dann wie folgt in Ihrer Async-Funktion verwenden
hoffe das wird klappen
quelle
Ich bin etwas spät dran, aber ich werde auch meine Lösung hinzufügen. Es ist ein viel noobier Ansatz im Vergleich zu den Antworten hier.
Wenn Sie MongoDB Version 4.0 und Node.js 3.0 (oder höhere Versionen) verwenden, können Sie die
isConnected()
Funktion von verwendenMongoClient
.Das hat bei mir gut funktioniert. Ich hoffe es hilft.
quelle
Ich bin zu spät zur Party, aber hoffentlich hilft diese Antwort jemandem. Dies ist ein Funktionscode:
db.js
Wir exportieren eine Funktion, um eine Verbindung zum Mongo herzustellen, und eine andere, um die Instanz der Verbindung zu erhalten.
app.js.
Wir müssen die Anforderungen des Auth-Moduls erfüllen, nachdem wir die Verbindung initiiert haben, andernfalls gibt die Funktion getDb undefined zurück.
module.js
quelle
Da dies mit Express gekennzeichnet ist, dachte ich, ich würde erwähnen, dass Express eine integrierte Funktion zum Teilen von Daten zwischen Routen hat. Es gibt ein Objekt namens app.locals. Wir können ihm Eigenschaften hinzufügen und von unseren Routen aus darauf zugreifen. Sie instanziieren einfach Ihre Mongo-Verbindung in Ihrer app.js-Datei.
Auf diese Datenbankverbindung kann jetzt innerhalb Ihrer Routen wie unten beschrieben zugegriffen werden, ohne dass zusätzliche Module erstellt und benötigt werden müssen.
Diese Methode stellt sicher, dass für die Dauer Ihrer App eine Datenbankverbindung geöffnet ist, es sei denn, Sie möchten sie jederzeit schließen. Es ist leicht zugänglich
req.app.locals.your-collection
und erfordert keine zusätzlichen Module.quelle
Wenn Sie sich für die Verwendung von Mungo in Ihrer Anwendung entscheiden, bearbeiten Sie Ihre Datei app.js mit dem folgenden Snippet
app.js.
Nächster Schritt: Definieren Sie Modelle für Ihre Anwendung, die Sie benötigen, und führen Sie die CRUD-Operation beispielsweise direkt aus
blogSchema.js
Verwendung createBlog.js
Sie müssen nicht immer eine Verbindung zu mogoDB herstellen ....
quelle
quelle
quelle
Ich finde das funktioniert gut :)
mongoUtil.ts
anyFile.ts
quelle
javascript
Eine TypeScript-Antwort ist nicht angemessen.