Saya telah membaca dan membaca dan masih bingung tentang apa cara terbaik untuk berbagi koneksi database (MongoDb) yang sama di seluruh aplikasi NodeJs. Seperti yang saya pahami, koneksi harus dibuka saat aplikasi dimulai dan digunakan kembali antar modul. Ide saya saat ini tentang cara terbaik adalah server.js
(file utama tempat semuanya dimulai) terhubung ke database dan membuat variabel objek yang diteruskan ke modul. Setelah terhubung, variabel ini akan digunakan oleh kode modul seperlunya dan koneksi ini tetap terbuka. Misalnya:
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
kemudian modul lain models/user
terlihat seperti itu:
Users = function(app, mongo) {
Users.prototype.addUser = function() {
console.log("add user");
}
Users.prototype.getAll = function() {
return "all users " + mongo.dbUsers;
}
}
module.exports = Users;
Sekarang saya memiliki perasaan buruk bahwa ini salah, jadi apakah ada masalah yang jelas dengan pendekatan ini dan jika demikian, bagaimana cara membuatnya lebih baik?
sumber
module.exports = mongoist(connectionString);
. (Baca tentangconnectionString
di Manual MongoDB.)Jawaban:
Anda dapat membuat
mongoUtil.js
modul yang memiliki fungsi untuk menghubungkan ke mongo dan mengembalikan instance mongo db:Untuk menggunakannya, Anda akan melakukan ini di
app.js
:Dan kemudian, ketika Anda membutuhkan akses ke mongo di tempat lain, seperti di
.js
file lain , Anda dapat melakukan ini:Alasan ini berfungsi adalah bahwa dalam node, ketika modul-modul itu
require
'd, mereka hanya dimuat / bersumber sekali sehingga Anda hanya akan berakhir dengan satu contoh_db
danmongoUtil.getDb()
akan selalu mengembalikan contoh yang sama.Catatan, kode tidak diuji.
sumber
app.js
dalam fungsi callbackconnectToServer
. Jika Andarequire
dalamapp.js
sebelum_db
ditetapkan, maka Anda akan mendapatkan error terdefinisi dalam modul lain.var database = mongoUtil.getDb(); database.db().collection( 'users' )
.Ada banyak cara yang dapat mengubah ini untuk menerima objek konfigurasi di beberapa tempat, tetapi secara keseluruhan ini mirip dengan cara Anda menyusun kode, meskipun dengan sintaks JS yang lebih modern. Dapat dengan mudah ditulis ulang menjadi prototipe dan callback, jika itu kebutuhan Anda.
mongo.js
Users.js
app.js
someFile.js
sumber
Inilah cara saya melakukannya dengan sintaksis kontemporer, berdasarkan contoh go-oleg. Punyaku teruji dan berfungsi.
Saya memberi beberapa komentar di kode.
sumber
Jika Anda menggunakan Express, maka Anda dapat menggunakan modul express-mongo-db yang memungkinkan Anda mendapatkan koneksi db di objek permintaan.
Install
server.js
routes / users.js
sumber
go-oleg pada dasarnya benar, tetapi saat ini Anda (mungkin) tidak ingin menggunakan "mongodb" itu sendiri, melainkan menggunakan beberapa kerangka kerja, yang akan melakukan banyak "pekerjaan kotor" untuk Anda.
Misalnya, luwak adalah salah satu yang paling umum. Inilah yang kami miliki di
server.js
file awal kami :Ini semua yang dibutuhkan untuk mengaturnya. Sekarang gunakan ini di manapun dalam kode Anda
Dan Anda mendapatkan contoh yang Anda siapkan
mongoose.connect
sumber
Inisialisasi koneksi sebagai janji:
Dan kemudian panggil koneksi setiap kali Anda ingin Anda melakukan tindakan pada database:
sumber
Solusi teruji berdasarkan jawaban yang diterima:
mongodbutil.js:
app.js:
activities.js - rute:
sumber
Inilah pengaturan saya pada tahun 2020:
./utils/database.js
/app.js
sumber
kita dapat membuat file dbconnection seperti dbconnection.js
lalu gunakan file ini di aplikasi Anda seperti
dan kemudian gunakan seperti ini di dalam fungsi asinkron Anda
semoga ini berhasil
sumber
Saya agak terlambat untuk ini, tetapi saya akan menambahkan solusi saya juga. Ini adalah pendekatan yang jauh lebih noob dibandingkan dengan jawaban di sini.
Bagaimanapun jika Anda menggunakan MongoDB versi 4.0 dan Node.js 3.0 (atau versi yang lebih tinggi) Anda dapat menggunakan
isConnected()
fungsi dariMongoClient
.Ini bekerja dengan baik untuk saya. Semoga membantu.
sumber
Saya terlambat ke pesta, tapi semoga jawaban ini akan membantu seseorang, ini adalah kode fungsional:
db.js
Kami mengekspor satu fungsi untuk terhubung ke mongo dan fungsi lainnya untuk mendapatkan de instanceof koneksi.
app.js
Kita harus melakukan keperluan modul auth setelah kita memulai koneksi, jika tidak fungsi getDb akan kembali tidak terdefinisi.
module.js
sumber
Karena ini ditandai dengan Express, saya pikir saya akan menyebutkan bahwa Express memiliki fitur bawaan untuk berbagi data antar rute. Ada sebuah objek bernama app.locals. Kami dapat melampirkan properti ke sana dan mengaksesnya dari dalam rute kami. Anda cukup membuat contoh koneksi mongo Anda di file app.js Anda.
Koneksi database ini sekarang dapat diakses dalam rute Anda seperti di bawah ini tanpa perlu membuat dan memerlukan modul tambahan.
Metode ini memastikan bahwa Anda memiliki koneksi database yang terbuka selama aplikasi Anda kecuali Anda memilih untuk menutupnya kapan saja. Ini mudah diakses dengan
req.app.locals.your-collection
dan tidak memerlukan modul tambahan.sumber
Jika Anda memilih untuk menggunakan luwak dalam aplikasi Anda, edit file app.js Anda dengan cuplikan berikut
app.js
Langkah Berikutnya: Tentukan Model untuk aplikasi Anda yang memerlukannya dan lakukan operasi CRUD secara langsung misalnya
blogSchema.js
Gunakan createBlog.js
Anda tidak perlu selalu terhubung ke mogoDB ....
sumber
sumber
sumber
Saya menemukan ini bekerja dengan baik :)
mongoUtil.ts
anyFile.ts
sumber
javascript
, jangan anggap jawaban TypeScript sesuai.