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;