0

I have my nodejs project, and I want to separate loggers from my route.js to have a clean code.

But I have the next problem, when I try to load my logger to the route.js file, it shows me the next error:

TypeError: loggers.getTicketLogger is not a function
    at Object.<anonymous> (/home/ismael/projects/nodejs-ticketing/routes/ticket.js:3:23)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Module.require (module.js:367:17)
    at require (internal/module.js:16:19)
    at Object.<anonymous> (/home/ismael/projects/nodejs-ticketing/server.js:49:1)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:141:18)
    at node.js:933:3

I have the next code inside my loggers dir:

loggers/ticket.js

var log4js = require('log4js');

module.exports = function(){

  getTicketLogger = function(){
    var logger = null;

    log4js.loadAppender('file');
    log4js.addAppender(log4js.appenders.file(__dirname + '/../log/ticket.log'), 'ticket-log');

    logger = log4js.getLogger('ticket-log');
    logger.setLevel('DEBUG');

    return logger;
  }

};

And my route.js file, has the next head

routes/ticket.js

var Ticket  = require('../models/ticket'),
    loggers = require('../loggers/ticket.js'),
    log     = loggers.getTicketLogger();

module.exports = function(app){
}

What I'm doing wrong, and how can improve the code to separate logger from route.js file.

Thanks you.

Ismael Moral
  • 722
  • 1
  • 9
  • 35

1 Answers1

1

loggers/ticket.js should return an object that has your getTicketLogger method.

var log4js = require('log4js');

module.exports = function() {

  var getTicketLogger = function(){
    var logger = null;

    log4js.loadAppender('file');
    log4js.addAppender(log4js.appenders.file(__dirname + '/../log/ticket.log'), 'ticket-log');

    logger = log4js.getLogger('ticket-log');
    logger.setLevel('DEBUG');

    return logger;

  }

  return { getTicketLogger: getTicketLogger };

};

Then in routes/ticket.js

var loggers = require('./../loggers/ticket.js')();
var log = loggers.getTicketLogger;

typeof loggers; // => object
typeof log; // => function 
Daniel Lizik
  • 3,058
  • 2
  • 20
  • 42
  • I have doubts in this part of the code `return { getTicketLogger: getTicketLogger };`. What happens if I have more functions inside this module? – Ismael Moral Mar 16 '16 at 19:03
  • IMO `getTicketLogger` should be its own module since it's not a class method. If you want to "add more functions" instead of turning your `loggers/ticket.js` file into a pile spaghetti just have each function be its own module. – Daniel Lizik Mar 16 '16 at 19:07
  • How can I turn my module into a class to define all loggers inside it? – Ismael Moral Mar 16 '16 at 19:10