我正在学习使用 nodejs 和 redis 数据库进行开发。我正在使用快速框架。
问题:假设在 Redis 中,我有一些用户信息在散列中,键为 user:id,比我上次登录键 user_laSTLogged:user_id 和我在 user_favourites:user_id 中有他最喜欢的项目。
我想呈现包含用户详细信息、上次登录时间和他的收藏的页面。 Node js 中的项目。
我会使用类似这样的东西,但它当然不会起作用,因为方法回调是异步运行的。
var redis = require("redis");
var client = redis.createClient();
router.get('/', function (req, res, next) {
var userId='1';
var returnHtml = '';
client.hgetall('user:'+userId, function(err,objects){
returnHtml+=utils.inspect(objects);
});
client.hgetall('user_lastlogged:'+userId, function(err,objects){
returnHtml+=utils.inspect(objects);
});
client.hgetall('user_favourites:'+userId, function(err,objects){
returnHtml+=utils.inspect(objects);
});
res.send(returnHtml);
});
请暂时忽略适当的 redis 数据类型等的使用。
这种任务在node.js中一般是怎么解决的?或者也许在 express js 框架中(如果有帮助的话)?
谢谢!
最佳答案
在 node 中,大部分代码都是异步的,所以你会经常遇到这种用例。
基本上,您应该使用回调来链接操作。
var redis = require("redis");
var client = redis.createClient();
router.get('/', function (req, res, next) {
var userId='1';
var returnHtml = '';
client.hgetall('user:'+userId, function(err,objects){
returnHtml+=utils.inspect(objects);
client.hgetall('user_lastlogged:'+userId, function(err,objects){
returnHtml+=utils.inspect(objects);
client.hgetall('user_favourites:'+userId, function(err,objects){
returnHtml+=utils.inspect(objects);
res.send(returnHtml);
});
});
});
});
如您所见,它有点回调 hell ,您可以查看 https://github.com/NodeRedis/node_redis#user-content-promises promise 调用以使其更具可读性。
对于 bluebird ,它可能看起来像:
var bluebird = require('bluebird');
var redis = require('redis');
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
var client = redis.createClient();
router.get('/', function (req, res, next) {
var userId='1';
var returnHtml = '';
client.hgetallAsync('user:'+userId)
.then(function(objects){
returnHtml += utils.inspect(objects);
return client.hgetallAsync('user_lastlogged:'+userId);
})
.then(function(objects){
returnHtml+=utils.inspect(objects);
return client.hgetallAsync('user_favourites:'+userId);
})
.then(function(objects){
returnHtml+=utils.inspect(objects);
res.send(returnHtml);
})
.catch(function(err){
//manage error
});
});
关于node.js - 同步调用redis方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39058815/