2014-10-05 2 views
0

У меня есть 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) до конца моих тестов, и он работает сейчас. Я знаю, что это антиклиматическое.

ответ

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

Проблема с ниже код getPages может быть вызвана перед прирастить и H Установите сделаны, так что не возвращает страниц.

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

Я ценю помощь, но я уже пробовал это, и это не сработало. Страницы не сохраняются в redis вообще, когда я вызываю createPage(). Я открою redis-cli и запустил «hgetall pages», и ни одна из моих тестовых страниц не вернется. К сожалению, это не проблема с асинхронностью. – kfedorov91

Смежные вопросы