How correctly use Redis with Koa (node.js)
Asked Answered
T

2

9

I try to get an information from a redis db and return it as the body of the response to the user. First, here is a code that fails :

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)

Surely because the yield calls end before the callback is called.

Then here is a code that success :

function askRedit (callback) {
    client.get("test", callback);
}

app.use(function* (next) {
    this.body = yield askRedit;
    yield next;
});

But I clearly misunderstand why the second one is working. Does the yield in yield askRedit have the same behavior than the one in yield next ?

EDIT : I just seen a page that seems to answers a little : https://github.com/visionmedia/co/blob/master/examples/redis.js

So now I will try to understand these misterious yield.. is this a way of doing synchronous things with asynchronous calls ?

Toplevel answered 26/8, 2014 at 0:41 Comment(0)
T
8

Here is the correct solution :

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

theses links helped :

https://github.com/koajs/workshop/tree/master/01-co

http://www.jongleberry.com/koa.html

and "co-redis" of course

Thanks to myself !

Toplevel answered 26/8, 2014 at 8:51 Comment(1)
There is little documentation with Koa and all the modules! I feel for you as I am having to figure this all out aswell!Executrix
I
0

You could also use:

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);
Ionic answered 27/10, 2015 at 15:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.