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 

有关requiremodule.exports如何工作的详细信息,我将引用您最近在同一主题上发布的答案:

require在node.js中的行为