I use separate router files as modules for main app and auth app. I can't get the best way to pass variables(db client) into routers. I don't want to hardcode it or pass it with:
module.exports = function(app, db) {
Maybe it's best way to use singleton register or use global db variable?
What is your experiense with design-patterns? Which way is the best and why?
Each module in Node. js has its own context, so it cannot interfere with other modules or pollute global scope. Also, each module can be placed in a separate . js file under a separate folder.
I have found using dependency injection, to pass things in, to be the best style. It would indeed look something like you have:
// App.js module.exports = function App() { }; // Database.js module.exports = function Database(configuration) { }; // Routes.js module.exports = function Routes(app, database) { }; // server.js: composition root var App = require("./App"); var Database = require("./Database"); var Routes = require("./Routes"); var dbConfig = require("./dbconfig.json"); var app = new App(); var database = new Database(dbConfig); var routes = new Routes(app, database); // Use routes.
This has a number of benefits:
require("databaseSingleton")
or worse, global.database
.Routes
in isolation, I can inject it with fake app
and database
params and test only the Routes
code itself.server.js
, the app entry point). This gives you a single place to look to see how everything fits together in the system.One of the better explanations for this that I've seen is an interview with Mark Seeman, author of the excellent book Dependency Injection in .NET. It applies just as much to JavaScript, and especially to Node.js: require
is often used as a classic service locator, instead of just a module system.
I suggest you create a settings file with db instance and with other things which you need use globally like 'singleton'.
For example, I have settings.js with my redis db client:
var redis = require('redis'); exports.redis = redis.createClient(6379, '127.0.0.1');
And in other multiple modules I include it:
var settings = require('./settings'); setting.redis.<...>
Many time including it I always have one instance of db connection.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With