我尝试从 Redis 数据库中获取信息并将其作为响应正文返回给用户。首先,这是一个失败的代码:
var redis = require("redis"),
koa = require("koa");
var app = koa(),
port = process.argv[2] || 3000,
client = redis.createClient();
app.use(function* (next) {
client.get("test", function (err, res) {
this.body = res;
});
yield next;
});
app.listen(port);
console.log("listen on port " + port)
肯定是因为 yield 调用在调用回调之前结束。
然后这里是一个成功的代码:
function askRedit (callback) {
client.get("test", callback);
}
app.use(function* (next) {
this.body = yield askRedit;
yield next;
});
但我显然误解了为什么第二个有效。 yield askRedit
中的 yield
是否与 yield next
中的行为相同?
编辑: 我刚刚看到一个页面似乎回答了一点:https://github.com/visionmedia/co/blob/master/examples/redis.js
所以现在我将尝试理解这些神秘的 yield ..这是一种通过异步调用进行同步操作的方法吗?
最佳答案
这是正确的解决方案:
"Use strict";
var redis = require("redis"),
coRedis = require("co-redis"),
koa = require("koa");
var app = koa(),
port = process.argv[2] || 3000,
db = redis.createClient(),
dbCo = coRedis(db);
app.use(function* () {
yield dbCo.set("test", 42);
this.body = yield dbCo.get("test");
});
app.listen(port);
console.log("listen on port " + port)
这些链接有帮助:
https://github.com/koajs/workshop/tree/master/01-co
http://www.jongleberry.com/koa.html
当然还有“co-redis”
感谢我自己!
关于javascript - 如何正确使用 Redis 与 Koa (node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25496360/