node.js - 需要导出变量错误

时间:2014-01-19 21:28:06

标签: node.js

我有一个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

2 个答案:

答案 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

有关requiremodule.exports工作原理的详细信息,我将向您介绍我在同一主题上发布的最新答案:

Behavior of require in node.js

答案 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();