2016-01-10 2 views
0

У меня проблема с наследованием в node.js. У меня есть следующий код: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 relvant код:

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. Аналогичная проблема возникает с переменной idx.

Как определить переменную и модули Наследование в node.js (например, защищено на Java)?

+0

Это не то, как работают модули узла. Единственное существующее значение - это значение, присвоенное 'module.exports'. Эти переменные не определены в других модулях. – undefined

ответ

1

How I define variable and modules Inheritance in node.js (like protected in Java)?

Объекты в 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 объект эти переменные как свойства.

Может быть что-то вроде этого (я cant't проверить его, так что может быть некоторые настройки, что должно быть сделано)

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

Простое решение будет экспортировать объект.

server.js

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

s3.js

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

Однако я предлагаю переместить связанные регистратора код на его собственный файл для separation of concerns.

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

Спасибо. как насчет переменной idx? Как экспортировать его, чтобы он был общим для всех классов? – MiddleWare

+0

@MiddleWare вы можете экспортировать сеттер и getter для idx –

Смежные вопросы