Apakah mungkin untuk memberikan argumen saat memuat modul menggunakan require?
Saya memiliki modul, login.js yang menyediakan fungsionalitas login. Ini membutuhkan koneksi database, dan saya ingin koneksi database yang sama digunakan di semua modul saya. Sekarang saya mengekspor fungsi login.setDatabase (...) yang memungkinkan saya menentukan koneksi database, dan berfungsi dengan baik. Tetapi saya lebih suka meneruskan database dan persyaratan lainnya ketika saya memuat modul.
var db = ...
var login = require("./login.js")(db);
Saya cukup baru dengan NodeJS dan biasanya mengembangkan menggunakan Java dan Spring Framework, jadi ya ... ini adalah injeksi konstruktor :) Apakah mungkin untuk melakukan sesuatu seperti kode yang saya berikan di atas?
app
objek ke modul yang diperlukan.Jawaban:
Berdasarkan komentar Anda dalam jawaban ini , saya melakukan apa yang Anda coba lakukan seperti ini:
Saya menyusun hampir semua modul saya seperti itu. Sepertinya bekerja dengan baik untuk saya.
sumber
app
argumen itu perlu atau dapatkah saya mengabaikannya? Modul saya tidak akan menggunakan argumen aplikasi ini secara eksplisit, tetapi saya tidak tahu apakah itu diperlukan oleh node.js untuk beberapa hal internal. Jika tidak apa-apa, deklarasi modul saya akan terlihat seperti ini:module.exports = function (db) {
require(mymodule)(myargs)
akan memberi Anda modul untuk dikerjakan. Namun jika Anda mereferensikannya di tempat lain dari modul lain ?? dalam sistem dasar tampaknya ada cache yang terlibat, tetapi dalam sistem ini, cache akan mengembalikan metode generator kosong pada panggilan berikutnya kerequire()
, dan jika Anda memberikan args kepadarequire()(someargs)
Anda, Anda akan mendapatkan modul yang berbeda kembali ... mungkin saya hilang sesuatuvar module;
berada di luar fungsi ekspor, dan segera setelah Anda masuk, Anda ingin memeriksa apakahmodule
sudah ditentukan, dan jika demikian, kembalikan saja (dan jika tidak, inisialisasi). Apakah itu masuk akal?Saya tidak yakin apakah ini akan tetap berguna bagi orang, tetapi dengan ES6 saya memiliki cara untuk melakukannya yang menurut saya bersih dan berguna.
Dan kemudian Anda mendapatkan perilaku yang Anda harapkan.
sumber
Iya. Dalam
login
modul Anda , cukup ekspor satu fungsi yang mengambildb
argumennya. Sebagai contoh:sumber
module.exports = function(app,db) { ... } module.exports.auth = function(req,res) { ... authentication stuff }
Itu memanggil fungsi "anonim" dan menetapkan variabelapp
dandb
, tetapi, ketika melakukan ini aplikasi saya tidak akan menemukanauth
fungsi tersebut. Apa yang saya lakukan salah? Jika saya menghapus fungsi anonim,auth
fungsi tersebut dapat diakses lagi.exports
adalah sebuah objek. Anda dapat menetapkan properti untuk itu (beberapa ekspor), atau Anda dapat menetapkannya ke sebuah nilai. Sepertinya Anda menetapkan ekspor ke suatu fungsi, tetapi kemudian menetapkan auth sebagai properti dari fungsi yang Anda tetapkan untuk ekspor. Jadi, Anda perlu melakukanvar auth = require("./login.js").auth
yang mungkin bukan yang Anda inginkan. Jika Anda ingin menggunakan pola dari pertanyaan awal, mungkin yang terbaik adalah tetap menggunakan satu nilai ekspor. Jika ini masih tidak masuk akal, saya sarankan untuk memposting inti agar saya dapat melihatnya.auth
sebagai propertiexports
objek, dan kemudian di modul Anda menetapkanexports
fungsi (sehingga menimpa tugas sebelumnya). Jika Anda membalik urutan penetapan, Anda seharusnya dapat mengaksesauth
fungsi seperti yang diharapkan. Sekali lagi sulit untuk mengatakannya tanpa benar-benar melihat kodenya.var login = require('login')
danvar login = require('login')(app)
, tetapi ada perbedaan besar, tidak ada keajaiban dalam fungsi anonim yang dikembalikan, itu hanya fungsi / objek lain. Alih-alih memiliki amodule.exports.auth
, fungsi anomim sekarang mengembalikan fungsi autentikasi (di antara yang lain), yaitureturn { auth: authFunction, login: loginFunction}
. Jadi sekarang ini berhasil. Terima kasih.