2014-10-05 125 views
0

我正在處理的當前項目中有一個DAO(數據訪問對象),這是一個redis db的抽象。這裏是所有的代碼是將是有關我下面即將到來的問題:node redis客戶端HSET命令失敗

var redis = require("redis"); 
var _ = require("underscore"); 
var exceptions = require("./exceptions"); 

function Dao (port, address) { 
    var self = this; 

    console.log("Connecting to redis @ %s:%s", address, port); 
    var client = redis.createClient(port, address); 

    function incrCount (callback) { 
     client.incr("count", callback); 
    }; 

    this.getPages = function (callback) { 
     client.hgetall("pages", function (err, pages) { 
      if (err) { 
       callback(err); 
      } else if (!pages) { 
       callback(exceptions.NoPages); 
      } else { 
       callback(err, _.reduce(Object.keys(pages), function (array, id) { 
        array.push(JSON.parse(pages[id])); 
        return array; 
       }, []));   
      } 
     }); 
    }; 

    this.createPage = function (page, callback) { 
     incrCount(function (err, results) { 
      if (err) { 
       callback(err); 
      } else { 
       page.id = results; 
       self.updatePage(page); 
       callback(err, {id: results}); 
      } 
     }); 
    }; 

    this.updatePage = function (page) { 
     client.hset("pages", page.id, JSON.stringify(page)); 
    }; 
}; 

每當我使用這個對象,例如:

function printResults (err, results) { 
    console.log(err || results); 
}; 

var dao = new Dao(port, address); 
dao.createPage({testpage: "testcontent"}); // DOES NOT ADD PAGE TO DB, I HAVE NOT IDEA WHY, HOWEVER COUNT IS INCREMENTED TO 1 AS IT SHOULD BE 
dao.getPages(printResults); // PRINTS ERROR: NO PAGES EXIST IN DB 
dao.updatePage({id: 1, testpage: "testcontent"}); // ADDS PAGE TO DB, AND THIS IS EXACTLY HOW THE FUNCTION WOULD HAVE BEEN CALLED INTERNALLY BY CREATEPAGE() ABOVE 
dao.getPages(printResults); // RETURNS TEST PAGE 

什麼是沒有意義的是,createPage()調用引擎蓋下的updatePage()!爲什麼直接調用updatePage()時僅在數據庫中創建頁面?儘管createPage()實際上並沒有將任何頁面添加到redis,但它也只是調用updatePage()。我已經用一百萬個console.log()語句填充了我的代碼來記錄每件事情,以確保我不會瘋狂,但是當createPage()調用updatePage()時,它會使用有效的參數進行操作,所以我沒有看到什麼問題可能會發生。

EDIT(解決了,我猜):顯然我跑了關閉DB它有機會充分接受/處理createPage調用之前的測試中,我添加了一個的setTimeout(db.close(),2000 )到我的測試結束,它現在可以工作。我知道,反氣候。

回答

1

你不等待hset的回調我會改變它,所以它使用回調。

this.createPage = function (page, callback) { 
    incrCount(function (err, results) { 
     if (err) { 
      callback(err); 
     } else { 
      page.id = results; 
      self.updatePage(page, function(err) { 
       callback(err, {id: results}); 
      });     
     } 
    }); 
}; 

this.updatePage = function (page, callback) { 
    client.hset("pages", page.id, JSON.stringify(page), callback); 
}; 

然後改變你的代碼,看看它是否有什麼差別

var dao = new Dao(port, address); 
dao.createPage({testpage: "testcontent"}, function(err, page) { 
    if (err) { 
     return console.log(err) 
    } 
    dao.getPages(printResults); 
}); 

與下面的代碼的問題是增量和HSET完成之前GETPAGES可以被調用,因此它沒有返回頁面。

dao.createPage({testpage: "testcontent"}); 
dao.getPages(printResults); 
+0

我欣賞的幫助,但我已經試過,並沒有奏效。當我調用createPage()時,頁面不會被存儲在redis中。我將打開redis-cli並運行「hgetall頁面」,我的測試頁面都不會回來。不幸的是,這不是一個不同步的問題。 – kfedorov91 2014-10-05 04:59:00