我有一个node.js脚本,可以为我做一些数据库查询,并且运行正常。脚本开始变得更长一点,所以我想我可能会开始分解它,并认为将数据库连接代码移到另一个文件是有意义的。
下面是我已移入另一个文件然后包含在require语句中的代码。
我遇到的问题是脚本底部的'exports'命令。似乎函数'dbHandleDisconnectUsers()'导出正常,但变量'dbConnectionUsers'没有。
脚本错误指的是对象'dbConnectionUsers'的方法(我希望这是正确的终端)丢失并给我的印象我并没有真正传递一个完整的对象。注意:我会包含确切的错误,但我不在机器前面。
var mysql = require('/usr/lib/node_modules/mysql');
// Users Database Configuration
var dbConnectionUsers;
var dbConfigurationUsers = ({
host : 'xxxxx',
user : 'xxxxx',
password : 'xxxxx',
database : 'xxxxxx',
timezone : 'Asia/Singapore'
});
// Users Database Connection & Re-Connection
function dbHandleDisconnectUsers() {
dbConnectionUsers = mysql.createConnection(dbConfigurationUsers);
dbConnectionUsers.connect(function(err) {
if(err) {
console.log('Users Error Connecting to Database:', err);
}else{
dbConnectionUsers.query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;");
dbConnectionUsers.query("SET SESSION sql_mode = 'ANSI';");
dbConnectionUsers.query("SET NAMES UTF8;");
dbConnectionUsers.query("SET time_zone='Asia/Singapore';");
}
});
dbConnectionUsers.on('error', function(err) {
console.log('Users Database Protocol Connection Lost: ', err);
if(err.code === 'PROTOCOL_CONNECTION_LOST') {
dbHandleDisconnectUsers();
} else {
throw err;
}
});
}
dbHandleDisconnectUsers();
exports.dbHandleDisconnectUsers() = dbHandleDisconnectUsers();
exports.dbConnectionUsers = dbConnectionUsers;
在核心脚本中,我有这个需要声明:
var database = require('database-connect.js');
我将函数/变量称为
database.dbHandleDisconnectUsers()
database.dbConnectionUsers
答案 0 :(得分:4)
忽略其他人在exports.dbHandleDisconnectUsers() = dbHandleDisconnectUsers()
中指出的语法错误,我将指出dbConnectionUsers未初始化。
JavaScript是一种传递副本的参考语言,因此这些行:
var dbConnectionUsers;
exports.dbConnectionUsers = dbConnectionUsers;
基本上与
相同exports.dbConnectionUsers = undefined;
即使您稍后设置了dbConnectionUsers,也不会影响exports.dbConnectionUsers
,因为它包含原始dbConnectionUsers
引用的副本。
在原始数据类型中,它类似于:
var x = 5;
var y = x;
x = 1;
console.log(x); // 1
console.log(y); // 5
有关require
和module.exports
工作原理的详细信息,我将向您介绍我在同一主题上发布的最新答案:
答案 1 :(得分:3)
您的功能正在运行但您的其他变量未导出,这很奇怪。情况并非如此。
导出函数时,通常不希望将它们作为求值函数导出(即aFunction()
)。唯一可能的情况是,如果要导出任何函数returns
,或者如果要将构造函数的实例导出为模块的一部分。
另一件事,真的很奇怪,在上面的评论中提到的是你试图给exports.dbHandleDisconnectUsers()
赋值,这应该是未定义的并抛出错误。
因此,换句话说:您的代码不应该像exports.whatever() = whatever()
。
相反,您应该导出两个函数和其他属性,如下所示:
exports.dbHandleDisconnectUsers = dbHandleDisconnectUsers; // no evaluation ()
exports.dbConnectionUsers = dbConnectionUsers;
我不知道这是否是唯一的错误,但这肯定是一件可能导致执行错误的事情:)
另外,考虑到Brandon所指出的内容,您最初会导出未定义的内容。但是在你的脚本中,无论如何你都要覆盖引用。
你应该做的是做一个新的对象引用,它是持久的并且在其中有一个你可以更新的属性。即:
var dbConnection = {users: null};
exports.dbConnection = dbConnection;
然后当你运行你的功能时:
function dbHandleDisconnectUsers() {
dbConnection.users = mysql.createConnection(dbConfigurationUsers);
dbConnection.users.connect(function(err) {
if(err) {
console.log('Users Error Connecting to Database:', err);
}else{
dbConnection.users.query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;");
dbConnection.users.query("SET SESSION sql_mode = 'ANSI';");
dbConnection.users.query("SET NAMES UTF8;");
dbConnection.users.query("SET time_zone='Asia/Singapore';");
}
});
dbConnection.users.on('error', function(err) {
console.log('Users Database Protocol Connection Lost: ', err);
if(err.code === 'PROTOCOL_CONNECTION_LOST') {
dbHandleDisconnectUsers();
} else {
throw err;
}
});
}
这样,dbConnection
的对象引用永远不会被覆盖。
然后,您将在模块中引用您的users
db连接:
database.dbConnection.users
您的功能应该仍然有效,因为您之前打算使用它:
database.dbHandleDisconnectUsers();