节点redis客户端HSET命令失败

时间:2014-10-05 01:40:37

标签: javascript node.js redis

我正在处理的当前项目中有一个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}}我的测试结束了,现在可以了。

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