2016-01-04 2 views
2

Я пытаюсь разработать класс со статическими методами в приложении NodeJs в качестве цели модуля Config.
Я хотел бы получить к нему доступ из разных модулей без создания экземпляра каждый раз при новом объекте.Класс экспорта NodeJS со статическими методами

1) Правильно ли использовать такой подход, как показано ниже, избегая прототипа класса?

function Config(){ 

} 

Config.svrPort=function(){ 
    return 8080; 
} 

Config.dbName=function(){ 
    return "myDbName"; 
} 

module.exports = Config; 

2) Есть ли другие решения?

3) Является ли это также действительным подходом к размещению разных объектов в одном модуле (например, config.js)?

exports.server=function(){ 
    return{ 
     port:8080 
    }; 
}; 

exports.database=function(){ 
    return{ 
     name:"myDbName", 
     user:"root", 
     password:"myPassword", 
     host:"localhost", 
     port:3306 
    }; 
}; 

и, наконец, использовать его как:

var config = require('./config'); 
config.server().port 
config.database().name 
+0

почему не только литерал объекта? –

+3

Это правильный подход, хотя в вашем примере вы можете просто сохранить значения в качестве примитивов: 'Config.SVR_PORT = 8080', также обратите внимание, что я переписал их как« константы », так как я не рекомендую менять статику. – andlrc

+0

Я согласен с @ dev-null. Просто используйте 'var Config = {SVG_PORT: 8080, ...}'. Вы также можете использовать 'Object.freeze'. – Louy

ответ

0

Там нет классов на языках прототипа (это только синтаксис, который имитирует классическую ООП). Следовательно, не существует статических методов. Я предполагаю, что вам нужен синглтон (это то же самое, что и object literal).

var Config = { 
    get svrPort() { 
     return 8080; 
    }, 

    get dbName() { 
     return "myDbName"; 
    }, 
}; 

// updated: https://nodejs.org/api/modules.html#modules_caching 
// module.exports = Object.create(Config); 
module.exports = Config; 
+0

Почему 'Object.create'? – Louy

+0

@ Louy Зависит от использования [конкретного] (http://stackoverflow.com/questions/6613261/is-there-any-reason-to-use-object-create-or-new-in-javascript) использования. – Vidul

+0

@ Vidul, просто вопрос: что происходит каждый раз, когда я получаю значение от этого объекта? Будет создан новый экземпляр объекта? Это как объект с заводским методом? –

1

JS поддерживает литералы объектов, не говоря уже о том, что вы можете экспортировать один объект или несколько свойств экспорта на объекте по умолчанию exports ... Когда require('./your-module'); происходит код в модуле не снова запустят , он просто возвращает исходный экспорт, который имеет собственный оригинальный контекст.


Просто экспортируйте каждую из функций/переменных, которые вы хотите либо как объектный литерал, либо привязаны к экспорту.

//just declare any private context as it's own variables in your module, these are static 
var someVal = "this isn't visible outside the module"; 

//export single object, with methods attached 
// NOTE: by default exports exists, and is already module.exports 
// exports === module.exports 
exports = module.exports = { 
    getSomeVal: function getSomeVal(){ 
    return someVal; 
    }, 
    getSrvPort: function getSrvPort(){ 
    return 8000; 
    } 
    ... 
} 

//alternatively, export each method as property 
// note, you should name your function assignments, 
// this helps with debugging. 
exports.getDbName = function getDbName(){ 
    return "mydb"; 
}; 

Код только на самом деле запускается один раз, и все его места будут видеть ту же опцию.


Как и в сторону, если вы используете Babel с ES6 модулями, вы можете просто объявить экспорт с каждым методом ...

export function getSrvPort() { 
    return 8000; 
} 

export function dbName() { 
    return "mydb"; 
} 
1

Это правильный подход, хотя в вашем примере вы мог просто сохранить значения в качестве примитивов: Config.SVR_PORT = 8080, примечание Я переписал их как «константы», так как я не рекомендую менять статику.

Если это указано, обратите внимание: Не не помещайте в файлы JavaScript какие-либо конфиденциальные данные (пароли и т. Д.), А вместо этого помещайте их в файл конфигурации. Это отделит конфигурацию от кода. И помогите вам не утечка какой-либо потенциальной важной информации.

db-secrets.JSON

{ 
    "password": "...", 
    ... 
} 

Тогда вы можете получить доступ к секретам, делая модуль обертки:

// Wrapper module for db-secrets.json 
var fs = require('fs'); 
exports = JSON.parse(fs.readFileSync('db-secrets.json'), 'utf8'); 

Или сделать дб подключить модуль db-connect.js:

var fs = require('fs'); 
var db = require('db'); 
var db_secrets = JSON.parse(fs.readFileSync('db-secrets.json'), 'utf8'); 

export = function() { 
    return db.connect(db_secrets.user, db_secrets.password, ...); 
}; 

Если вы используете Git для управления версиями вы может легко добавить следующее к вашему .gitignore, которое позволит убедиться, что ваш чувствительный файл не добавлен в git:

.gitignore

db-secrets.json 
+0

Я определенно согласен с тобой, чтобы помещать чувствительные данные в своего рода файл AppSonfig JSON и переносить его в модуль с «исчерпывающими» объектами Javascript. –

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