如何在Koa (node.js)中正确使用Redis

9

我尝试从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”中的“yield”具有相同的行为吗?
编辑:我刚看到一个似乎回答了一点问题的页面:https://github.com/visionmedia/co/blob/master/examples/redis.js 现在我将尝试理解这些神秘的yield...这是一种使用异步调用进行同步操作的方法吗?
2个回答

8
以下是正确的解决方案:
"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"

感谢自己!


Koa和所有模块的文档都很少!我理解你的感受,因为我也在努力弄清楚这一切! - basickarl

0

你也可以使用以下方法:

var koa = require('koa');
var app = koa();
var redis = require('then-redis');

var db = redis.createClient('tcp://redis:6379');

db.set('my-key', 0);

app.use(function *(){
    db.incrby('my-key', 5);
    this.body = yield db.get('my-key');
});

app.listen(9000);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接