我正在学习Node.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);
});
答案 0 :(得分:4)
constants
是一个内置节点模块,提供系统级常量,以便与其他内置模块一起使用,例如fs
,crypto
等。如果你想要您的 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)并且不必在其他地方更改它(如果您不需要保持名称同步)。
希望有所帮助! :)