Node.js常量问题

时间:2016-01-09 23:08:21

标签: javascript node.js

我正在学习Node.js,我在将常量集成到我的服务中时遇到了麻烦。我创建了一个常量文件,并从其他文件引用这些值。不幸的是,当我引用常量而不是仅仅将文字放入我的所有函数调用中时,我似乎没有正确地执行它,因为事情开始失败。

constants.js

exports.DB_HOST = 'localhost';
exports.DB_PORT = 3306;
exports.DB_USER = 'user';
exports.DB_PASSWORD = 'password';
exports.DB_DATABASE = 'database';

尝试连接到MySQL数据库时,连接失败,因为服务器声称凭据不正确。但是,当我用文字替换下面的所有常量时,一切正常(所以我没有使用不正确的身份验证信息)。

var constants = require('constants');

...

var connection = mysql.createConnection({
    host: constants.DB_HOST,
    port: constants.DB_PORT,
    user: constants.DB_USER,
    password: constants.DB_PASSWORD,
    database: constants.DB_DATABASE
});

...

connection.query('SELECT * FROM table',
    function(err, rows, fields) {
        res.send(err);
});

3 个答案:

答案 0 :(得分:4)

constants是一个内置节点模块,提供系统级常量,以便与其他内置模块一起使用,例如fscrypto等。如果你想要您的 constants.js,您需要包含(绝对或相对)路径。例如:

var constants = require('./constants');

答案 1 :(得分:3)

除了更改require()以使用本地模块而非内置模块外:

var constants = require('./constants');

您的代码中有拼写错误:

port: constants.DB_POST,
//  wrong character  ^ 

应该是:

port: constants.DB_PORT,

答案 2 :(得分:2)

所以,有几件事:

  • 看起来你正在尝试要求一个名为constants的已安装节点模块或一个内置模块(在内置节点模块中,它几乎就是我们的一组常量) fs,http,crypto等)。这将是您无法访问它的主要原因。节点不知道要查找本地模块b / c没有提供路径字符串。

  • 您可以稍微清理一下您的模块,但可以(有时)进行有用的重构。

我建议您对模块的使用方式进行以下更改:

// Bc it's a set of constants, use the es6/2015 `const` if available when requiring your module
const constants = require('./constants');

您可以稍微清理模块w / module.exports;让你真正清楚你所暴露的对象是什么:

module.exports = {
  DB_HOST : 'localhost',
  DB_PORT : 3306,
  DB_USER : 'user',
  DB_PASSWORD : 'password',
  DB_DATABASE : 'database',
}

另一个考虑因素:在大多数应用中,您确实希望将配置保持为内部无状态。这意味着您的应用程序不应该将任何配置值硬编码到其中。通常,如果您避免这样做,您将在外部进行更灵活的设置。换句话说,您可以根据需要启动尽可能多的不同实例,并连接到许多不同的数据库。更改数据库时,您只需更改环境,而不是应用程序本身。而且,如果你深入了解它的语义,你的应用程序的工作就是连接,而不是真正决定连接的位置 - 环境应该提供。因此,这些可以从您的模块中获得:

const config = {
  DB_HOST : process.env.DB_HOST,
  DB_PORT : process.env.DB_PORT,
  DB_USER : process.env.DB_USER,
  DB_PASSWORD : process.env.DB_PASSWORD,
  DB_DATABASE : process.env.DB_DATABASE,
};
module.exports = config;

你可以从process.env.YOUR_VAR的任何地方访问它们,但是如果你想将它们整合在一个模块中,它在很多方面同样好,并且可以让你更改外部配置值变量名称(即进程。 env.DB_USERNAME而不是DB_USER)并且不必在其他地方更改它(如果您不需要保持名称同步)。

希望有所帮助! :)