javascript - 分离的 node.js 应用程序中的 Redis 客户端

标签 javascript node.js express redis

您好,我在 node.js 应用程序中使用 redis 进行用户缓存。用户登录后,用户信息被缓存,并在每次其他请求时访问,以确定用户具有什么访问权限,客户端根据此接收信息、 View 等。 现在,该应用程序在开始时创建了一个 redisClient 并将其传递给所需的快速路由回调(几乎是所有回调)。老实说,我真的不喜欢随处传递的额外参数——尤其是当它们相同时。 有没有更好的方法来做到这一点,例如,如果我在每个模块中初始化 redisClient 是否会有额外的开销

var express = require('express'),
    loginFunctionality = require('./routes/login'),
    homeFunctionality = require('./routes/home')
    ...

// Connect to redis
var redisClient = redis.createClient();
redisClient.on("error", function(err){
    console.log("An error occurred with redis:" + err);
});
... 


app.get('/', homeFunctionality.home);

app.post('/register', loginFunctionality.createNewUser);

app.post('/login', loginFunctionality.login(redisClient, secret));
...

我想知道的是,有没有什么好的办法去掉redisClient参数。

最佳答案

您可以通过中间件将客户端连同每个请求一起传递:

// initialization
var client = redis.createClient(...);

app.use(function(req, res, next) {
  req.redis = client;
  next();
});

// a route handler
app.get('/', function(req, res) {
  req.redis.get(...);
  ...
});

或者,如果适用,您可以创建一个更精细的中间件来执行缓存查找本身并将用户数据与请求一起传递,这样您就不必在每个请求处理程序中执行查找。

或者您可以将 Redis 客户端初始化移动到一个单独的模块,并从您需要的每个文件中要求它:

// redis-client.js
var redis = require('redis');
module.exports = redis.createClient(...);

// elsewhere
var client = require('./redis-client');

app.get('/', function(req, res) {
  client.get(...);
  ...
});

添加于 2019 年 1 月 16 日

请记住,使用此技术,如果某些操作(如 Ctrl+C)断开了服务器连接,您可以轻松关闭连接,只需添加 client .quit().

process.on('SIGTERM', () => {
  if (client) {
    console.log('Ending CACHE connection');
    client.quit();
  }
  console.log('Closing server...');
  app.close(() => {
    console.log('server was closed!');
    process.exit(0);
  });
});

关于javascript - 分离的 node.js 应用程序中的 Redis 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29877172/

相关文章:

javascript - Node.js 服务器 waterfall 错误 TypeError : Cannot read property 'Symbol(Symbol.toStringTag)' of undefined

node.js - 如何访问 knex 查询结果

javascript - AngularJS - 同一函数内的解除绑定(bind)事件传递给绑定(bind)?

javascript - 确定 DOM 已更改

javascript - 在回调中重用变量/对象

node.js - 使用 OOP 扩展 Node.js 模块

javascript - 修复了图像无法在旧版移动浏览器上呈现的问题,例如黑莓

Javascript 时间跨度未返回预期结果

mysql - 如何使用sequelize和mysql设置默认值?

javascript - angularjs SEO 友好的 url 不起作用