node.js – 要求导出variables错误
我有一个node.js脚本,为我做一些数据库查询,并正常工作。 脚本开始变得更长了,所以我想我可能会开始分解它,并认为将数据库连接代码移出到另一个文件是有道理的。
下面是我已经移动到另一个文件,然后包含在一个require语句的代码。
我遇到的问题是脚本底部的“exports”命令。 它似乎函数'dbHandleDisconnectUsers()'导出罚款,但variables'dbConnectionUsers'不。
脚本错误指的是对象'dbConnectionUsers'的方法(我希望这是正确的terminal)缺失,给我的印象我并不真正传递一个完整的对象。 注:我会包括确切的错误,但我不在机器前面。
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');
我把这个函数/variables称为
database.dbHandleDisconnectUsers() database.dbConnectionUsers
奇怪的是你的函数正在工作,但你的其他variables不导出。 这不应该是这样的。
当你导出函数时,你通常不希望将它们导出为评估函数(即aFunction()
)。 你唯一可能的是如果你想要导出任何函数returns
,或者如果你想导出一个构造函数的实例作为你的模块的一部分。
另一件事情,很奇怪,在上面的评论中提到的是,你正试图给exports.dbHandleDisconnectUsers()
赋值,这应该是一个未定义的,并且会引发错误。
所以,换句话说:你的代码不应该像exports.whatever() = whatever()
。
相反,你应该导出这样的函数和其他属性:
exports.dbHandleDisconnectUsers = dbHandleDisconnectUsers; // no evaluation () exports.dbConnectionUsers = dbConnectionUsers;
我不知道这是唯一的错误在这里,但这肯定是一件事情,可能会导致执行错误或两个:)
此外,考虑到布兰登也指出了,你最初出口的东西不确定。 但是在你的脚本中,无论如何你都会覆盖参考。
你应该做的是做一个新的对象引用,它是持久的,并有一个属性,你可以更新。 即:
var dbConnection = {users: null}; exports.dbConnection = dbConnection;
然后当你运行你的function:
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
数据库连接:
database.dbConnection.users
您的函数仍然可以像以前一样使用它:
database.dbHandleDisconnectUsers();
忽略其他人在exports.dbHandleDisconnectUsers() = dbHandleDisconnectUsers()
指出的语法错误,我将指出dbConnectionUsers是未初始化的。
JavaScript是通过引用的副本语言,因此这些行:
var dbConnectionUsers; exports.dbConnectionUsers = dbConnectionUsers;
基本上是相同的
exports.dbConnectionUsers = undefined;
即使稍后设置了dbConnectionUsers,也不会影响exports.dbConnectionUsers
因为它包含原始dbConnectionUsers
引用的副本。
在原始数据types中,类似于:
var x = 5; var y = x; x = 1; console.log(x); // 1 console.log(y); // 5
有关require
和module.exports
如何工作的详细信息,我将引用您最近在同一主题上发布的答案:
require在node.js中的行为