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 : .js
So now I will try to understand these misterious yield.. is this a way of doing synchronous things with asynchronous calls ?
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./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 ?
Share Improve this question edited Aug 26, 2014 at 1:02 AntoineKa asked Aug 26, 2014 at 0:41 AntoineKaAntoineKa 1851 silver badge6 bronze badges2 Answers
Reset to default 8Here 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./koajs/workshop/tree/master/01-co
http://www.jongleberry./koa.html
and "co-redis" of course
Thanks to myself !
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);