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

时间:2016-01-10 09:18:28

标签: javascript node.js inheritance

我在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)?

2 个答案:

答案 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}}