Node.js 将函数导出到不同文件中的多个调用者

Node.js 将函数导出到不同文件中的多个调用者,node.js,Node.js,我正在构建一个日志模块,它可以被位于不同文件中的多个调用者调用 我的目标是在程序开始时初始化日志文件,让调用者只调用一个函数,该函数记录到先前初始化的文件中,而不需要再次进行整个初始化 我不能完全掌握模块导出的概念,因此我希望您能提供帮助 实际日志记录发生在写入方法上。在主app.js文件中,我可以很好地启动和记录 然而,在另一个文件上,我有一个思维障碍,就是如何在不再次创建日志文件的情况下直接登录到该文件 var fs = require('fs'); var fd = {}, log =

我正在构建一个日志模块,它可以被位于不同文件中的多个调用者调用

我的目标是在程序开始时初始化日志文件,让调用者只调用一个函数,该函数记录到先前初始化的文件中,而不需要再次进行整个初始化

我不能完全掌握模块导出的概念,因此我希望您能提供帮助

实际日志记录发生在写入方法上。在主app.js文件中,我可以很好地启动和记录

然而,在另一个文件上,我有一个思维障碍,就是如何在不再次创建日志文件的情况下直接登录到该文件

var fs = require('fs');

var fd = {},
log = {},
debug = false;

var tnlog = function(env, file, hostname, procname, pid) {
  if (env == 'development')
    debug = true;

  fd = fs.createWriteStream(file, { flags: 'a', encoding: 'utf8', mode: 0644 });
  log = { hostname: hostname, procname: procname, pid: pid };
};

tnlog.prototype.write = function(level, str) {
  if (debug)
  console.log(str);
  else {
    log.timestamp = Date.now();
    log.level = level;
    log.str = str;
    fd.write(JSON.stringify(log) + '\n');
  }
};

exports.tnlog = tnlog;
这是我初始化和登录主文件的方式:

var logfile = '/var/log/node/www/app.log';
var tnlog = require('./lib/tnlog').tnlog,
    log = new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid);
如果你能提出更好的方法,我一定会非常感激。

edit 最简单的解决办法是

var logfile = '/var/log/node/www/app.log';
var tnlog = require('./lib/tnlog').tnlog,
module.exports = new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid);
进入一个单独的文件(mylogger.js),并要求您在任何地方使用
logger=require“/mylogger.js
”记录内容。您总是会返回
tnlog
的单个实例,因为节点缓存导出的值

我还看到您可能正在使用Express,所以您也可以这样做

app.set(“logger”、新的tnlog(app.get('env')、日志文件、os.hostname()、appname、process.pid))

并使用
app.get(“记录器”)
在任何有
app
对象引用的地方检索它

古老的 更复杂的是:

您必须决定是否要在同一应用程序运行时支持记录到不同的文件。如果是这样,您绝对需要为每个日志文件创建一个对象。您不必导出构造函数本身,还可以导出工厂模式和单例模式之间的混合模式

您可以创建如下内容:

var loggers = {}
module.exports = function getLogger(env, file, hostname, procname, pid) {
  key = env + file + hostname + procname + pid)
  if(loggers[key]) return loggers[key]
  return loggers[key] = new Logger(env, file, hostname, procname, pid)
}
也就是说,根据连接函数参数变量,检查是否已经创建了logger对象

当然,您需要创建一个合适的记录器构造函数,但我假设您了解一点Javascript

请注意,
loggers
对象仍将是一个私有变量,就像
Logger
构造函数一样。由于node.js缓存模块导出的对象,因此
loggers
对象的值将作为
getLogger
闭包的一部分,在多次调用
require
时保持不变