hellzone
hellzone

Reputation: 5246

How to pass variable to other modules with NodeJS?

I want to pass my logServiceClient object to all other modules included in server.js file. When I run below code it prints empty object;

logServiceClient{}

Is there any way to pass logServiceClient to all other included modules?

server.js file;

....
const logger = new Logger({
   level: new CLevel('warn'),
   ordered
}) 

var logServiceClient = require('./app/logServiceClient')(logger)
var userHandler = require('./app/userHandler')(logServiceClient)

userHandler file;

module.exports = function(logServiceClient){
    console.log('logServiceClient' + JSON.stringify(logServiceClient))
}

Upvotes: 0

Views: 182

Answers (2)

Steven Spungin
Steven Spungin

Reputation: 29169

There a many ways to inject without pulling in the logger from your other modules.

Use a factory to indirectly create and initialize your objects/modules

function factoryCreateModule() {
  var client = require('client')
  client.$logger = require('logger')
}

function factoryRequireModule(module) {
  var client = require(module)
  client.$logger = require('logger')
}

var client = factoryCreateModule()
client.logger.log('hello')

var client2 = factoryRequireModule('client')
client2.logger.log('hello')

Add your logger to all objects using prototype

Of course you can narrow down the target object...

var logger = {
  log(message) {
    console.log(message)
  },
  warn(message) {
    console.log('!!! ' + message)
  }
}

Object.prototype.$logger = logger

var x = 12;
x.$logger.log('I am a number')

var str = "Hello"
str.$logger.warn('WARNING FROM STRING')

Make your logger global

global is the 'window' in the module system.

// just for snippit to run
window.global = {}

var logger = {
  log(message) {
    console.log(message)
  }
}

// main module
global.$logger = logger

// client module
global.$logger.log('hello world')

Pass the logger into the constructor or init method

var logger = require('logger')

var client = require('client')(logger)

var client2 = require('client2')({logger})

var client3 = require('client3')
client3.init(logger)

Upvotes: 2

Ioannis Perpirakis
Ioannis Perpirakis

Reputation: 11

// file1.js

var foo = "bar";
exports.foo = foo;

//file2.js

var myModule = require('./file1');
var foo = myModule.foo;

Upvotes: 1

Related Questions