node.js - 同步调用redis方法

标签 node.js express redis

我正在学习使用 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/

相关文章:

javascript - 在 node.js 转换流中处理背压的正确方法是什么?

linux - npm install -Error/npm/optimist/0.3.7' - Linux Mint

node.js - 带有数组的多部分/表单数据

node.js - 使用 node.js 和 MongoDB 对 Web 应用程序进行 Docker 化时的代码 14

redis - redis pub/sub 模型是否需要与 redis 的持久连接?

Node.js: radio 流媒体 API

node.js - ExpressJS如何构建应用程序?

node.js - 错误 MSB007 node.js Mongoose

redis - 如何获取与redis中特定模式不匹配的键?

Laravel 5.4 事件触发,但未广播