Czytałem i czytałem i nadal nie wiem, jaki jest najlepszy sposób udostępniania tego samego połączenia z bazą danych (MongoDb) w całej aplikacji NodeJs. Jak rozumiem, połączenie powinno być otwarte podczas uruchamiania aplikacji i ponownie używane między modułami. Mój obecny pomysł na najlepszy sposób jest takiserver.js
(główny plik, w którym wszystko się zaczyna) łączy się z bazą danych i tworzy zmienną obiektową, która jest przekazywana do modułów. Po podłączeniu ta zmienna będzie używana przez kod modułu w razie potrzeby i to połączenie pozostanie otwarte. Na przykład:
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
potem kolejny moduł models/user
wygląda tak:
Users = function(app, mongo) {
Users.prototype.addUser = function() {
console.log("add user");
}
Users.prototype.getAll = function() {
return "all users " + mongo.dbUsers;
}
}
module.exports = Users;
Teraz mam okropne przeczucie, że to źle, więc czy są jakieś oczywiste problemy z tym podejściem, a jeśli tak, to jak je ulepszyć?
źródło
module.exports = mongoist(connectionString);
. (Przeczytaj oconnectionString
MongoDB Manual.)Odpowiedzi:
Możesz utworzyć
mongoUtil.js
moduł, który będzie miał funkcje zarówno do łączenia się z mongo, jak i zwracania instancji mongo db:Aby go użyć, zrobiłbyś to w swoim
app.js
:A potem, gdy potrzebujesz dostępu do mongo w innym miejscu, np. W innym
.js
pliku, możesz to zrobić:Powodem, dla którego to działa, jest to, że w węźle, gdy moduły są `
require
` d '', są ładowane / pozyskiwane tylko raz, więc zawsze będziesz mieć tylko jedną instancję_db
imongoUtil.getDb()
zawsze zwrócisz tę samą instancję.Uwaga, kod nie został przetestowany.
źródło
app.js
ramach funkcji wywołania zwrotnego programuconnectToServer
. Jeśli ustawiszrequire
jeapp.js
wcześniej_db
, otrzymasz niezdefiniowane błędy w innych modułach.var database = mongoUtil.getDb(); database.db().collection( 'users' )
.Istnieje wiele sposobów, w jakie można to zmienić, aby akceptować obiekty konfiguracyjne w miejscach, ale ogólnie jest to podobne do tego, jak masz ułożony kod, aczkolwiek z bardziej nowoczesną składnią JS. Można go łatwo przepisać na prototypy i wywołania zwrotne, jeśli takie są Twoje wymagania.
mongo.js
Users.js
app.js
someFile.js
źródło
Oto, jak robię to za pomocą współczesnej składni na przykładzie go-olega. Mój jest przetestowany i funkcjonalny.
W kodzie umieściłem kilka komentarzy.
źródło
Jeśli używasz Express, możesz użyć modułu express-mongo-db , który pozwala uzyskać połączenie db w obiekcie żądania.
zainstalować
server.js
route / users.js
źródło
go-oleg ma w zasadzie rację, ale w dzisiejszych czasach (prawdopodobnie) nie chcesz używać samego "mongodb", raczej użyj jakiegoś frameworka, który wykona za ciebie dużo "brudnej roboty".
Na przykład mangusta jest jedną z najczęstszych. Oto, co mamy w naszym początkowym
server.js
pliku:To wszystko, czego potrzeba, aby go skonfigurować. Teraz użyj tego w dowolnym miejscu w kodzie
Otrzymujesz instancję, z którą skonfigurowałeś
mongoose.connect
źródło
Zainicjuj połączenie jako obietnicę:
A następnie zadzwoń do połączenia, gdy chcesz wykonać akcję na bazie danych:
źródło
Sprawdzone rozwiązanie na podstawie zaakceptowanej odpowiedzi:
mongodbutil.js:
app.js:
activity.js - trasa:
źródło
Oto moja konfiguracja w 2020 roku:
./utils/database.js
/app.js
źródło
możemy utworzyć plik dbconnection, taki jak dbconnection.js
a następnie użyj tego pliku w swojej aplikacji, np
a następnie użyj w ten sposób wewnątrz funkcji asynchronicznej
mam nadzieję, że to zadziała
źródło
Trochę się spóźniłem, ale dodam też moje rozwiązanie. To znacznie bardziej hałaśliwe podejście w porównaniu z odpowiedziami tutaj.
W każdym razie, jeśli używasz MongoDB w wersji 4.0 i Node.js 3.0 (lub nowszych wersjach), możesz użyć
isConnected()
funkcji zMongoClient
.To działało dobrze dla mnie. Mam nadzieję, że to pomoże.
źródło
Spóźniłem się na imprezę, ale mam nadzieję, że ta odpowiedź komuś pomoże, oto kod funkcjonalny:
db.js
Eksportujemy jedną funkcję, aby połączyć się z mongo, a drugą, aby uzyskać instancję połączenia.
app.js
Po zainicjowaniu połączenia musimy spełnić żądanie modułu auth, w przeciwnym razie funkcja getDb zwróci wartość undefined.
module.js
źródło
Ponieważ jest to oznaczone jako Express, pomyślałem, że wspomnę, że Express ma wbudowaną funkcję udostępniania danych między trasami. Istnieje obiekt o nazwie app.locals. Możemy dołączyć do niego właściwości i uzyskać do niego dostęp z wnętrza naszych tras. Po prostu tworzysz instancję połączenia mongo w pliku app.js.
Dostęp do tego połączenia z bazą danych można teraz uzyskać w ramach tras, jak pokazano poniżej, bez konieczności tworzenia i wymagania dodatkowych modułów.
Ta metoda zapewnia, że masz otwarte połączenie z bazą danych na czas działania aplikacji, chyba że zdecydujesz się je zamknąć w dowolnym momencie. Jest łatwo dostępny
req.app.locals.your-collection
i nie wymaga dodatkowych modułów.źródło
Jeśli zdecydujesz się na używanie mongoose w swojej aplikacji, wyedytuj plik app.js za pomocą następującego fragmentu
app.js
Następny krok: Zdefiniuj modele dla swojej aplikacji, wymagaj ich i wykonaj bezpośrednio operację CRUD, na przykład
blogSchema.js
Zastosowanie createBlog.js
Nie musisz zawsze łączyć się z mogoDB ....
źródło
źródło
źródło
Uważam, że to działa dobrze :)
mongoUtil.ts
anyFile.ts
źródło
javascript
, nie myśl, że odpowiedź TypeScript jest odpowiednia.