我在node.js中继承有问题。我有以下代码:
Main.js版权代码:
var s3_prototype_require = require("./s3")
var s3_prototype = new s3_prototype_require();
function getDoc(file) {
s3_prototype.read(file, function(err) {
return_result(res, err);
})
}
server,js relvant code:
var server = function(){};
var idx = 0;
var winston = require('winston')
var logger = new(winston.Logger)({
transports: [
new(winston.transports.File)({
stream: fs.createWriteStream(log_g, {
flags: 'a'
}),
options: {
highWaterMark: 32
}
})
]
});
module.exports = server;
s3.js relvant代码:
var server= require('./server'),
util = require('util');
var s3 = function() {
this.s3 = 's3';
};
util.inherits(server, s3);
s3.prototype.read = function(file, callBack) {
logger.info("Read file...");
idx = idx + 1;
}
问题是我在以下错误上失败了:ReferenceError: logger is not defined
。这是我在server.js代码中定义logger变量的事实。 idx
变量也会出现类似的问题。
我如何在node.js中定义变量和模块继承(如Java中的protected)?
答案 0 :(得分:1)
我如何在node.js中定义变量和模块继承(如Java中的protected)?
JavaScript中的对象与Java等语言中的传统对象略有不同。对象实际上不具有受保护的值,但您可以使用prototypes through prototypical inheritance进行继承。针对您的特定问题,您只需要使用其各自的属性定义server
变量,以便在创建对象实例时对其进行初始化。
问题在于你的server.js
。您可以在该文件中本地定义logger
以及其他一些变量,但只导出server
变量,该变量与这些其他变量无关。
// You're only exporting this function
var server = function(){};
// These are not being exported and just live within this file.
var idx = 0;
var winston = require('winston')
var logger = new(winston.Logger)({
transports: [
new(winston.transports.File)({
stream: fs.createWriteStream(log_g, {
flags: 'a'
}),
options: {
highWaterMark: 32
}
})
]
});
module.exports = server;
要解决此问题,请尝试将这些变量server
对象指定为属性。
也许这样的事情(我不能测试它,所以可能需要做一些调整)
var server = function(){
this.idx = 0;
this.winston = require('winston');
this.logger = new(winston.Logger)({
transports: [
new(winston.transports.File)({
stream: fs.createWriteStream(log_g, {
flags: 'a'
}),
options: {
highWaterMark: 32
}
})
]
});
};
module.exports = server;
答案 1 :(得分:1)
简单的解决方案是导出对象。
server.js
var serverObj = require('./server');
var server = serverObj.server;
var logger = serverObj.logger;
s3.js
var server = require('./server');
var logger = require('./logger');
但是为了separation of concerns,我建议将与记录器相关的代码移到它自己的文件中。
{{1}}