简体   繁体   English

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

[英]Node.js / Inheritance of variables and modules

I have trouble with inheritance in node.js. 我在node.js中继承有麻烦。 I have the following code: 我有以下代码:

Main.js relavnt code: 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: 服务器,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;

s3.js relvant code: s3.js相关代码:

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;     
}

The problem is that I failed on the following error: ReferenceError: logger is not defined . 问题是我因以下错误而失败: ReferenceError: logger is not defined This is despide the fact I defined the logger variable in the server.js code. 这是我在server.js代码中定义了logger变量的事实。 Similar problem happens with the idx variable. idx变量idx发生类似的问题。

How I define variable and modules Inheritance in node.js (like protected in Java)? 如何在node.js中定义变量和模块继承(如Java中的保护)?

How I define variable and modules Inheritance in node.js (like protected in Java)? 如何在node.js中定义变量和模块继承(如Java中的保护)?

Objects in JavaScript are a little different from your traditional objects in languages like Java. JavaScript中的对象与Java等语言中的传统对象有些不同。 Objects can't really have protected values, but you can have inheritance by utilizing prototypes through prototypical inheritance . 对象实际上并没有受保护的值,但是您可以通过原型继承利用原型来继承 With your particular problem, you just need to define your server variable with its respective properties so that they can be initialized when you create instances of your object. 对于您的特定问题,您只需要定义server变量及其各自的属性,以便在创建对象实例时可以对其进行初始化。

The problem lies with your server.js . 问题出在您的server.js You define logger , along with some other variables, locally within that file, but you only export the server variable, which is unrelated to these other variables. 您可以在该文件中本地定义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;

To fix this, try assigning your server object these variables as properties. 要解决此问题,请尝试为server对象分配这些变量作为属性。

Maybe something like this (I cant't test it so there may be some tweaking that needs to be done) 也许是这样的(我无法测试,所以可能需要做一些调整)

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;

Simple solution would be to export an object. 简单的解决方案是导出对象。

server.js server.js

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

s3.js s3.js

var serverObj = require('./server');
var server = serverObj.server;
var logger = serverObj.logger;

However I suggest moving the logger related code to it's own file for the sake of separation of concerns . 但是,我建议将记录器相关的代码移到它自己的文件中,以便分开关注点

var server = require('./server');
var logger = require('./logger');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM