我在我的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 {
//
};
}
};
一些可能性:
有没有更好/更清洁的方法?
答案 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 })
}
因此,每当您致电fncOne
或fncTwo
时,您都会记录msg
。
希望它有意义。