节点模块对象范围:跨所有函数共享对象

时间:2015-03-15 18:40:30

标签: javascript node.js

我正在编写一个多文件node.js应用程序,我正在使用模块来组织它的功能如下:

var custom_module = require('./module');

它有很多依赖关系,即MySQL。我不想将connection对象作为参数传递给模块中的所有函数(因为它们都需要它),所以我尝试过这样的事情:

// Module

var database = require('mysql');

(function (db) { 

    var mysqlConn = db.createConnection ({...});
    var connection = mysqlConn.connect();

    var function moduleFunction (someArgs) {
        connection.query('SELECT * FROM ....', function (err, result) {...});
    }

}(database);

我收到错误cannot call query method of undefined,基本上该对象尚未初始化/超出范围。

值得注意的是,在调用函数之前模块有时间加载,因为

调用了moduleFunction
express.get('/url_here', function (req, res) {
   custom_module.moduleFunction(....); 
});

main脚本中。

有没有办法确保在调用任何模块函数时初始化connection对象并在范围内?或者我是否必须每次初始化它并将其作为回调中的参数传递?

1 个答案:

答案 0 :(得分:1)

问题不在于作用域,而是假设调用connect返回连接对象。在mySql的节点模块中,情况并非如此,因为它在其他平台上。连接是一个过程而不是一个功能。 IE它执行一个操作,但不返回任何结果。但是,在JavaScript中,所有函数都返回一些东西。在没有显式返回语句的情况下,它们返回undefined。这意味着您在代码中明确地将undefined分配给connection。将代码更改为以下内容,您应该好好去

var database = require('mysql');

(function (db) { 

    var mysqlConn = db.createConnection ({...});
    mysqlConn.connect();

    var function moduleFunction (someArgs) {
        mysqlConn.query('SELECT * FROM ....', function (err, result) {...});
    }

}(database);

从连接池的角度来看,这种方法是否谨慎并不是那么明显。因此,从模块的预期用途中进行调查可能是值得的。