簡體   English   中英

Node.js /變量和模塊的繼承

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

我在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);
        })
     }

服務器,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相關代碼:

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變量idx發生類似的問題。

如何在node.js中定義變量和模塊繼承(如Java中的保護)?

如何在node.js中定義變量和模塊繼承(如Java中的保護)?

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對象分配這些變量作為屬性。

也許是這樣的(我無法測試,所以可能需要做一些調整)

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;

簡單的解決方案是導出對象。

server.js

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

s3.js

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

但是,我建議將記錄器相關的代碼移到它自己的文件中,以便分開關注點

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM