我正在编写一个多文件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
对象并在范围内?或者我是否必须每次初始化它并将其作为回调中的参数传递?
答案 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);
从连接池的角度来看,这种方法是否谨慎并不是那么明显。因此,从模块的预期用途中进行调查可能是值得的。