在 Node.js / Express 中的路由中传递 Redis 键值

Passing Redis Key-value in Routes in Node.js / Express

这与此类似question,但我的代码有多个路由。

下面的代码适用于我想做的事情,但我想知道是否有更简洁的方法来编写它,因为我对 Node/Express/Redis 还很陌生。

var express = require('express');
var router = express.Router();
var io = require('socket.io');
var redis = require('./../lib/redis');

redis.get('count', function(err, value) {
    if(err) throw err;

    /* GET Dashboard */
    router.get('/', function(req, res) {
      res.render('dashboard', {title: 'Data Dashboard', count: value });
    });

    /* GET Backend */
    router.get('/backend', function(req, res) {
      res.render('backend', {title: 'Backend', count: value });
    });
});

module.exports = router;

基本上,我只是将一个 Redis 键值传递给我的两个路由。 任何清理它的建议都将受到赞赏。

按照您编写代码的方式,您将在整个应用程序生命周期中传递相同的 count 键值。从 cleaning 向上的角度来看,代码没有任何问题,但从服务的角度来看,路由不应在 REDIS GET 回调中。

获取路由内的值

// Use everytime you need to count the key
function redisCount = function(callback) {
    redis.get('count', function(err, value) {
      if(err) callback(err)
      callback(null, value)
    }
}

/* GET Dashboard */
router.get('/', function(req, res) {
  redisCount(function(err,value) {
    if(err) throw err;
    res.render('dashboard', {title: 'Data Dashboard', count: value });
  })
});

/* GET Backend */
router.get('/backend', function(req, res) {
  redisCount(function(err,value) {
    if(err) throw err;
    res.render('backend', {title: 'Backend', count: value });
  })
});

但是,如果您这样做 count 调用 绝对是每条路由 ,我会建议使用一个中间件,它只在每次调用的上下文中设置值:

在单独的中间件中获取值

app.use(function (req, res, next) {
  // using the same function for the redis count
  redisCount(function(err, value) {

    // respond with error
    if (err) res.status("Could not connect to Redis")

    // otherwise set the value in the session
    req.session.value = value

    // and move on to the next middleware
    next()

  });
});

// now simply declare your routes

/* GET Dashboard */
router.get('/', function(req, res) {
  res.render('dashboard', {title: 'Data Dashboard', count: req.session.value });
});

/* GET Backend */
router.get('/backend', function(req, res) {
   res.render('backend', {title: 'Backend', count: req.session.value });
});