簡體   English   中英

JS-將連接(對象)從一個函數傳遞到另一個函數

[英]JS - passing a connection(object) from one function to another

我是JS新手,我有一個簡單的問題。 我正在編寫一個node_redis代碼以連接到數據庫。 我創建了一個數據庫模塊,其中有一個初始化函數來啟動連接。 該模塊還具有另一個查詢數據庫的功能。 對於查詢,我需要第一個函數的連接(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);
        });
    }
}
})();

現在,一種方法就是您所說的使dbConnection成為對象屬性。 另一種方法是在getValue()調用init() ,這會在每次需要一些值時建立不同的連接。

因為數據庫連接是寶貴的資源,所以我想最好使用第二種方法。 當然,那么您需要從init()返回dbConnection

PS:最初是為此類事情創建全局變量,然后人們看到它們越少越好。 這就是為什么使用全局變量被認為是不好的風格的原因。

我通過簡單地在父函數中聲明連接來使代碼起作用。

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
    }
})();

在完成上述工作的同時,我仍然希望有人告訴我如何在同一模塊的函數之間傳遞變量/對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM