NodeJS使用静态方法导出类

我正在尝试在NodeJs应用程序上用静态方法开发一个类,作为configuration模块的用途。
我想从不同的模块访问它,而不是每次都有一个新的对象实例化。

1)使用下面的方法是否正确,避免了类的原型?

function Config(){ } Config.svrPort=function(){ return 8080; } Config.dbName=function(){ return "myDbName"; } module.exports = Config; 

2)有没有其他解决scheme?

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 

JS支持对象文字,更不用说可以导出单个对象,或者默认exports对象上的多个导出属性…当require('./your-module'); 发生在模块中的代码不再运行,它只是返回原始的导出,它有自己的原始上下文。


只需要将每个要作为对象字面量的函数/variables导出,或者将其附加到导出。

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

这是正确的方法,虽然在你的例子中,你可以简单地将值存储为原语: Config.SVR_PORT = 8080 ,注意我把它们重写为“常量”,因为我不build议改变静态。

当这样说的时候,请注意: 不要把任何敏感数据(密码等)放在JavaScript文件中,而是把它们放在一个configuration文件中。 这将从代码中分离configuration。 并帮助您不要泄露任何潜在的重要信息。

DB-secrets.json

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

然后你可以通过制作一个包装模块来访问秘密:

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

或者build立一个db连接模块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 

原型语言中没有任何类(它只是一个模仿古典OOP的语法糖)。 因此没有静态的方法。 我的猜测是,你想要一个单身(这是相同的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;