Node.js常量有问题



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

常量.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);
});

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

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

除了将require()更改为使用本地模块而不是内置模块之外:

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

你的代码中有一个拼写错误:

port: constants.DB_POST,
//  wrong character  ^ 

应该是:

port: constants.DB_PORT,

因此,有两件事:

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

  • 您可能能够通过一些可选但(有时)有用的重构来清理您的模块。

我建议您对模块的要求进行以下更改:

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

您可以使用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从任何地方访问它们,但如果您想将它们整合到一个在许多方面都一样好的模块中,并允许您更改外部配置值变量名称(即process.env.DB_USERNAME而不是DB_USER),而不必在其他任何地方更改它(如果您不需要保持名称同步)。

希望能有所帮助!:)

最新更新