gpt4 book ai didi

javascript - Node redis 客户端 HSET 命令失败

转载 作者:可可西里 更新时间:2023-11-01 11:21:48 24 4
gpt4 key购买 nike

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

最佳答案

您不是在等待 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 可能在 incr 和 hset 完成之前被调用,因此它不返回任何页面。

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

关于javascript - Node redis 客户端 HSET 命令失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com