我正在处理的当前项目中有一个DAO(数据访问对象),它是redis数据库的抽象。以下是与我即将提出的问题相关的所有代码:
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()
。
编辑(已解决):显然我正在运行的测试是在有机会完全接收/处理createPage调用之前关闭数据库连接,我向setTimeout(db.close(), 2000)
添加了{{1}}我的测试结束了,现在可以了。
答案 0 :(得分: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);
});
以下代码的问题是在incr和hset完成之前可能会调用getPages,因此它不返回任何页面。
dao.createPage({testpage: "testcontent"});
dao.getPages(printResults);