У меня есть DAO (объект доступа к данным) в текущем проекте, над которым я работаю, это абстракция redis db. Вот весь код, который будет иметь отношение к моему наступающему вопросу ниже:узел redis client Ошибка 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 EVEN THOUGH, это также просто вызывает updatePage(). Я наполнил свой код миллионами команд console.log(), чтобы регистрировать ВСЕ, чтобы убедиться, что я не схожу с ума, но когда createPage() вызывает updatePage(), он делает это с допустимыми аргументами, поэтому я не вижу, что проблема может быть.
EDIT (решаемые, я думаю): Видимо тесты я бегущие приближались БД, прежде чем он имел возможность полностью получить/процесс на createPage звонки, я добавил SetTimeout (db.close(), 2000) до конца моих тестов, и он работает сейчас. Я знаю, что это антиклиматическое.
Я ценю помощь, но я уже пробовал это, и это не сработало. Страницы не сохраняются в redis вообще, когда я вызываю createPage(). Я открою redis-cli и запустил «hgetall pages», и ни одна из моих тестовых страниц не вернется. К сожалению, это не проблема с асинхронностью. – kfedorov91