NodeJS导出类与静态方法

时间:2016-01-04 22:43:13

标签: javascript node.js

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

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

3 个答案:

答案 0 :(得分:2)

这是正确的方法,尽管在您的示例中您可以简单地将值存储为基元: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

答案 1 :(得分:1)

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

只需将您想要的每个函数/变量导出为对象文字或附加到导出。

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

答案 2 :(得分:0)

原型语言中没有类(它只是模仿经典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;