我正在编写一个由许多节点js脚本组成的节点js工具。对于日志记录,我使用的是winston。但我面临一个问题。首先,我制作了一个单独的JS文件,它具有创建记录器和清除记录器传输的功能,它看起来如下: -
'use strict';
var winston = require('winston');
var logger;
function createLogger(service) {
logger = new (winston.Logger)({
level: 'info',
transports: [
new winston.transports.File(
{filename: ('logs/' + service + '_error.log'),
json: false})
]
});
return logger;
}
function clearLogger() {
logger.clear()
}
module.exports = {
createLogger: createLogger,
clearLogger: clearLogger,
logger: logger
};
让上面的文件作为logger-handler.js调用。现在,最初来自A.js,我用一些服务名称调用了createLogger函数。它已实例化,我可以在A.js中使用它。 A.js也称为B.js中的一些函数。现在,如果我想在B.js中使用相同的记录器,我会收到记录器未定义的错误。要在B.js中使用,我做了如下的事情: -
var logger = require('./logger-handler').logger;
我认为它应该有效,因为logger是全局变量,我在来到B.js之前已经初始化了它。但它将记录器变量指定为未定义。
有人可以帮助我做错了吗?
答案 0 :(得分:2)
你的记录器是 NOT 一个全局变量,他只存在于A.js.
如果你想让记录器成为一个全局变量 - 你必须通过将其分配给#include<stdio.h>
void main() {
int arr[]={10,20,30,40,50};
int *ptr=arr;
//printf("%d",*ptr);
printf("%d %d",*++ptr,*ptr++);
}
变量来实现,如下所示:
global
为每个全局变量分配一个前缀是个好习惯,这样你才能知道它是一个全局变量。我正在使用__作为前缀(双低破折号)
答案 1 :(得分:0)
是的!您的记录器未定义,因为在该模块中您所做的只是将其声明为 var 并且在像这样调用它之前从未创建过记录器:
var logger = require('./logger-handler').logger;
您需要在调用它之前先对其进行初始化,这样类似的东西才会起作用:
import {createLogger, logger} from './logger-handler';
//init your logger with the service name - based on whatever you wrote, so not too sure -
createLogger("enter the service");
//now your logger is ready to be used
logger.log('info', 'all done');
此外,您的 createlogger 函数不需要返回记录器。