1

私はJSが初めてで、簡単な質問があります。データベースに接続するための node_redis コードを書いています。接続を開始する init 関数がある db モジュールを作成しました。モジュールには、データベースを照会する別の関数もあります。クエリの場合、最初の関数の接続 (dbConnection) オブジェクトが必要になり、それを 2 番目の関数で使用します。どうすればいいですか?グローバル変数を使用してそれを行うことができますが、ほとんどの場所でそれは悪い考えだと教えてくれます。

質問がばかげている場合は申し訳ありませんが、コーディングの方法を学んでいます。Googleの結果は、それをオブジェクトプロパティとして渡すことで実行できることを教えてくれます。しかし、それが私の文脈で物事を行うための適切な方法であるかどうか、またはそれを行う方法さえもわかりません。

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、オブジェクトのプロパティを作成する方法があります。もう1つの方法は、何らかの値が必要になるたびに異なる接続を確立するという結果init()を呼び出すことです。getValue()

DB 接続は貴重なリソースであるため、2 番目のバリアントを使用することをお勧めします。もちろん、から戻る必要がありdbConnectionますinit()

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 に答える