Как правильно использовать Redis с Koa (node.Яш)
Я пытаюсь получить информацию из БД 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
на yield askRedit
имеют то же поведение, что и в yield next
?
EDIT: Я только что видел страницу, которая, кажется, отвечает немного:https://github.com/visionmedia/co/blob/master/examples/redis.js
Итак, теперь я попытаюсь понять эти мистические уступки.. это способ делать синхронные вещи с асинхронными вызовами ?
2 ответов
вот правильное решение:
"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", конечно
Спасибо себе !
вы также можете использовать:
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);