Javascript Node.js/变量和模块的继承

Javascript Node.js/变量和模块的继承,javascript,node.js,inheritance,Javascript,Node.js,Inheritance,我在node.js中遇到继承问题。我有以下代码: Main.js relavnt代码: 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);

我在node.js中遇到继承问题。我有以下代码:

Main.js relavnt代码:

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);
        })
     }
服务器,js相关代码:

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;
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;     
}
s3.js相关代码:

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;
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未定义
。这是我在server.js代码中定义了logger变量的事实。类似的问题也发生在
idx
变量上

如何在node.js中定义变量和模块继承(如Java中的protected)

如何在node.js中定义变量和模块继承(如Java中的protected)

JavaScript中的对象与Java等语言中的传统对象略有不同。对象不能真正具有受保护的值,但可以通过利用来实现继承。针对您的特殊问题,您只需要定义带有相应属性的
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.js

module.exports = {
  server: server,
  logger: logger
};
s3.js

但是,为了方便起见,我建议将与记录器相关的代码移动到它自己的文件中


这不是节点模块的工作方式。唯一存在的值是分配给
模块的值。导出
。其他模块中没有定义这些变量。谢谢。idx变量呢?如何导出它,使它对所有类都通用?@中间件您可以为idx导出setter和getter
var server = require('./server');
var logger = require('./logger');