1

我正在使用clim并用它替换console对象。但我只想在模块存在时替换它。

try {
    var console = require('clim')();
} catch(err) {}
console.log('checking..');

如果模块不存在,它会导致console未定义。

奇怪的是,保存控制台对象和替换也不起作用

var console_backup = console;
try {
    var console = require('clim')();
} catch(err) {
    if (err) var console = console_backup;
}
console.log('checking..');

当不存在时仍然抛出错误(console未定义) 。clim

http://runnable.com/U8vlFEpIYtkiV2N9/24850946-console-for-node-js

如何使工作在存在时才console替换为?clim

4

2 回答 2

1

console您的第二次尝试很接近,但您需要在设置时明确标识要引用全局变量,console_backup否则它将引用提升的局部console变量,即使您尚未声明它:

var console_backup = global.console;
try {
    var console = require('clim')();
} catch(err) {
    if (err) var console = console_backup;
}
console.log('checking..');

或将其简化为:

try {
    var console = require('clim')();
} catch(err) {
    if (err) console = global.console;
}
console.log('checking..');
于 2014-07-20T17:00:07.680 回答
0

你不能console像那样覆盖全局。这var console只是创建一个隐藏全局的局部变量,console甚至global.console = ...不起作用。

您可以console.log单独覆盖等或覆盖process.stdout.writeconsole.log内部使用的内容),这将允许您在较低级别挂钩标准输出写入。这也将捕获可能process.stdout.write直接使用的其他任何人。

于 2014-07-20T13:39:42.150 回答