【问题标题】:node module object scope : share an object across all functions节点模块对象范围:在所有函数之间共享一个对象
【发布时间】:2015-03-16 14:55:21
【问题描述】:

我正在编写一个多文件 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 对象在调用任何模块函数时已初始化并在范围内?还是我必须每次都初始化它并在回调中将其作为参数传递?

【问题讨论】:

  • 我猜mysqlConn.connect(); 返回未定义。至少示例中没有使用返回值。你应该可以在mysqlConn 上拨打query 代替
  • 就是这样。非常感谢!

标签: javascript node.js


【解决方案1】:

问题不在于范围,而是假设连接调用返回一个连接对象。在 mySql 的节点模块中,情况并非如此,因为在其他平台上也是如此。连接是一个过程而不是一个函数。 IE它执行一个操作,但不返回任何结果。然而,在 JavaScript 中,所有函数都会返回一些东西。在没有显式返回语句的情况下,它们返回未定义。这意味着在您的代码中,您明确地将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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多