JS - 将连接(对象)从一个函数传递到另一个函数

时间:2013-01-19 12:05:03

标签: javascript node.js

我是JS的新手,我有一个简单的问题。我正在编写一个node_redis代码来连接到db。 我创建了一个db模块,其中有一个init函数来启动连接。 该模块还有另一个查询db的函数。对于查询,我将需要第一个函数中的连接(dbConnection)对象,然后在第二个函数中使用它。我该怎么做呢?我可以通过使用全局变量来完成它,但大多数地方告诉我它是一个坏主意。

对不起,如果问题很愚蠢,我正在学习如何编码。谷歌的结果告诉我,可以通过将其作为对象属性传递来完成。但我不知道这是否是在我的背景下做事的正确方法,甚至不知道如何去做。

var redis = require('redis'); 

module.exports = redisDb = {
// Initialize the module. Invokes callback when ready (or on error)
init: function(config, callback) {

    // Open the database connection
    var dbConnection = redis.createClient(config.db.port, config.db.host, {no_ready_check: true}); 

    dbConnection.auth(config.db.authKey, function() {
        console.log("Connected!");
        console.log(dbConnection.keys('*'));
    });

    dbConnection.on('connect'     , log('connect'));
    dbConnection.on('ready'       , log('ready'));
    dbConnection.on('reconnecting', log('reconnecting'));
    dbConnection.on('error'       , log('error'));
    dbConnection.on('idle'         , log('idle...'));
    dbConnection.on('end'         , log('end'));

    function log(type) {
        return function() {
            console.log(type, arguments);
        }
    }
    callback("callback - Connected");
},

getValue: function(key, callback) {
    dbConnection.hgetall("hosts", function (err, obj) {
    console.dir(obj);
    });
}
};

编辑: 尝试了另一种方式仍然失败。

module.exports = redisDb = (function() {
var config = require('../config');
var redis = require('redis'); 

return {
    connection: function(config) {
        var dbConnection = redis.createClient(config.db.port, config.db.host, {no_ready_check: true}); 

        dbConnection.auth(config.db.authKey, function() {
            console.log("Authenticated!");
        });
        return dbConnection
    },
    getValue: function(connection, callback) {
        connection.hgetall("hosts", function (err, obj) {
        console.dir(obj);
        });
    }
}
})();

2 个答案:

答案 0 :(得分:1)

现在,正如您所说的那样,将dbConnection作为对象属性。 另一种方法是在init()中调用getValue(),这会导致每次需要某些值时建立不同的连接。

因为数据库连接是一种有价值的资源,我认为使用第二种变体更好。 当然,您需要从dbConnection返回init()

PS:全球变量最初是针对这些事情做的,然后人们发现它们越少越好。这就是为什么使用全球变量被认为是一种糟糕的风格。

答案 1 :(得分:0)

我通过简单地在父函数中声明连接来使代码工作。

module.exports = _redisDb = (function() {

    var redis = require('redis'); 
    var config = require('../config');

    var dbConnection = redis.createClient(config.db.port, config.db.host, {no_ready_check: true});
    dbConnection.auth(config.db.authKey, function() {
        console.log("Authenticated!");
    });

    var getValue = function() {
            dbConnection.hgetall("hosts", function (err, obj) {
            console.dir(obj);
            });
        }

    return {
        getValue: getValue
    }
})();

在上述工作中,我仍然希望有人告诉我如何在同一模块的函数之间传递变量/对象。