1

我是 JS 新手,我有一个简单的问题。我正在编写一个 node_redis 代码来连接到数据库。我创建了一个 db 模块,其中有一个 init 函数来启动连接。该模块还有另一个查询数据库的功能。对于查询,我需要第一个函数中的连接(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);
        });
    }
}
})();
4

2 回答 2

1

现在一种方法是如您所说创建dbConnection一个对象属性。另一种方法是调用init()getValue()每次你想要一些值时都会建立不同的连接。

因为数据库连接是一种宝贵的资源,我会说最好使用第二种变体。当然,您需要dbConnectioninit().

PS:全局变量最初是为这些事情制作的,然后人们发现越少越好。这就是为什么使用全局变量被认为是一种不好的风格。

于 2013-01-19T12:14:55.333 回答
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
    }
})();

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

于 2013-01-19T23:17:08.090 回答