我正在處理的當前項目中有一個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 )到我的測試結束,它現在可以工作。我知道,反氣候。
我欣賞的幫助,但我已經試過,並沒有奏效。當我調用createPage()時,頁面不會被存儲在redis中。我將打開redis-cli並運行「hgetall頁面」,我的測試頁面都不會回來。不幸的是,這不是一個不同步的問題。 – kfedorov91 2014-10-05 04:59:00