Przeczytałem kilka dokumentów Stackoverflow idokumentacje mongoose dotyczące mongoose.connect () i mongoose.createConnection (), ale wydaje się, że nie ma wyraźnego wyjaśnienia tego ostatniego, w szczególności gdzie nawiązać połączenie. Nie jestem pewien, gdzie jest najlepsze miejsce na wykonanie mangoose lub jakichkolwiek połączeń z bazą danych, ale zwykle robię to w pliku server.js.
Czy można wykonywać połączenia w modelu?samo? Podczas korzystania z mongoose.createConnection () wydaje się, że połączenie w modelu jest jedyną opcją, ponieważ jeśli wykonam połączenie za pomocą createConnection w pliku serwera, nie będę mógł wyeksportować zwróconego obiektu połączenia i zaimportować go do pliku modelu .
Kiedy używam po prostu mongoose.connect (), zwykle mam to ustawione w pliku serwera,
var databaseUri = "mongodb://localhost/sampledatabse1020";
if (process.env.MONGODB_URI) {
mongoose.connect(process.env.MONGODB_URI);
} else {
mongoose.connect(databaseUri)
}
var database = mongoose.connection;
database.on("error", function(err) {
console.log("Mongoose Error: ", err);
});
database.once("open", function() {
console.log("Mongoose connection successful.");
});
ale jak już wcześniej powiedziałem, jeśli zmieniłem powyższy kod i użyłem
var connection = mongoose.createConnection()
Nie mogę wyeksportować connection
zmienna przechowująca obiekt połączenia zwrócony z mongoose.createConnection (). Czy więc musiałbym zrobić to w modelu takim jak on
var mongoose = require("mongoose");
var connection = mongoose.createConnection("mongodb://localhost/food");
var Schema = mongoose.Schema;
var UserSchema = new Schema({
first_name: {
type: String,
trim: true,
required: "First Name is Required"
},
last_name: {
type: String,
trim: true,
required: "Last Name is Required"
},
email: {
type: String,
trim: true,
required: "Email is Required"
}
});
var User = connection.model("User", UserSchema);
module.exports = User;
Rozumiem również, że inną opcją jest miećoddzielny plik, aby wykonać wszystkie połączenia z bazą danych, a nie w pliku serwera, ale jeśli zrobię to w ten sposób, jak mogę to zrobić, aby połączenia były nawiązywane tylko wtedy, gdy jest to konieczne?
AKTUALIZACJA: Dodałem funkcję createConnection () w modelu i wydaje się, że działa dobrze. Wiem jednak, że tworzenie połączeń w modelu nie jest idealne, ale jeśli tak, to gdzie mogę skonfigurować metodę createConnection (), ponieważ nie mogę jej wyeksportować i zaimportować do modeli, gdy jest ona zdefiniowana w innym pliku na przykład w server.js. Wszelkie sugestie będą mile widziane.
Odpowiedzi:
1 dla odpowiedzi № 1Możesz utworzyć plik mongoose.js w następujący sposób:
const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
mongoose.connect(process.env.MONGODB_URI, {useMongoClient: true});
module.exports = {mongoose};
Które następnie potrzebujesz w plikach modelu mangusty:
const mongoose = require("mongoose");
W ten sposób piszesz kod połączenia tylko raz i możesz zaimportować go tam, gdzie uznasz to za stosowne.
1 dla odpowiedzi nr 2
Nie używam Mongoose, ale myślę, że to zły pomysłże za każdym razem, gdy tworzysz nowy model lub instancję, tworzone będzie nowe połączenie z bazą danych. Powinno istnieć tylko jedno połączenie z bazą danych dla każdego żądania i mogą one zostać ponownie przetworzone w puli i czekać na następne żądanie. Oznacza to, że nie ważne ile masz modeli, powinny one dzielić to samo połączenie z bazą danych. Myślę, że połączenia z MongoDB są nadal cenne. Mam nadzieję, że ta sugestia trochę ci pomoże.