将模块参数从控制器传递到NodeJ中的模型

时间:2018-01-07 17:17:17

标签: node.js

我在我的NodeJs应用程序中使用MVC模式。

我有一个名为logger的模块,它是一个自定义的console.log函数,我想在所有其他模块中访问此模块,因为我想在任何地方记录信息。

所以我的server.js需要记录器模块。然后它将此参数传递给控制器​​。

const model = require('./model');

module.exports = function(app, logger){

app.get('/', function (req, res) {
    res.render('main', model.funcOne());
});

};

所以我希望我的模型有这个记录器变量。

module.exports = {
  funcOne: function(){
    logger.log("msg"); // missing module
    return {
//
    };
  },

  funcTwo: function(){
    logger.log("msg"); // missing module
    return {
//
    };
  }
};

一些可能性:

  • 我总是将记录器变量设置为我的模型函数的参数
  • 我在每个模块中都需要这个记录器模块

有没有更好/更清洁的方法?

1 个答案:

答案 0 :(得分:1)

我不确定这是不是你在找什么,但无论如何我会尽力帮忙。您可以使用高阶函数将函数与logger包装在一起。 它是如何工作的 - 假设你想记录你创建的每个函数。但是你不想重构所有这些并将console.log() // as example添加到所有这些中。所以你创建了一个withLogger高阶函数,如下所示:

const withLogger = (f) => (...params) => {
  console.log('logger')
  return f(...params)
}  

它需要一个函数作为输入参数,你想要记录什么,并返回“注入console.log()的”相同“函数。它起作用因为关闭,我希望你熟悉它。所以这是一个例子:

const multiply = (x, y) => x * y

const multiplyWithLogger = withLogger(multiply)
const result = multiplyWithLogger(3, 4); // console.log('logger') at this point
console.log(result) // 12

您可以对模块执行相同的操作,但需要执行更多其他步骤。

// withLogger.js
const logger = require('./mylogger');

const withLogger = (f) => (...params) => {
  logger.log('msg')
  return f(...params)
}

module.export = withLogger;

// your module
const withLogger = require('./withLogger');

module.export = {
  fncOne: withLogger(() => { //do some stuff you want })
  fncTwo: withLogger(() => { //do some stuff you want })
}

因此,每当您致电fncOnefncTwo时,您都会记录msg

希望它有意义。