node.js - 如何轻松包装整个 (Redis) 客户端

标签 node.js function redis

没有运气找到以前问过的问题;不完全确定如何措辞。

无论如何,我将从我要解决的问题开始。 在我们的应用程序中,我们使用 npm redis 模块将数据缓存到 Redis。我们初始化一个客户端并使其在我们的业务逻辑中可用并直接使用它。 然而现在,我们想要加密我们缓存的数据。因此,与其在主要业务逻辑中包含所有加密/解密逻辑,我认为如果我们可以简单地包装客户端,这样所有调用都将包含加密/解密步骤会更好。 问题是 redis 客户端有一大堆导出函数(set、hset、hmset、setex 等等),所以单独覆盖/包装每个函数会很痛苦。

所以,我的问题是,有没有办法包装整个客户端?这样如果调用客户端的任何函数,都会调用一个预处理函数,该函数会预先执行加密/解密,然后调用redis客户端自己的函数。

例如

myClient.foo()
   call encrypt()
   call redisClient.foo()

但是对于 redis 客户端的每个导出函数,是否会自动发生上述情况?

同样,这是早期的想法,所以这样做甚至可能没有意义。需要确定依赖于某些功能的某些行为;例如哪个调用加密,哪个调用解密等。 但是,我想我想知道以上是否有可能以一种干净的方式进行?即使是简单的通用功能,如记录每个客户端调用或不依赖于功能的东西。

编辑: 尝试简化我正在考虑做的事情。 如果我们不考虑加密。 是否可以动态导出函数名? 类似于以下内容,除了“foo”是动态的,可用于调用同名的 redisClient 导出函数:

exports.myClient.foo = function(){ //where foo can be any value?
  genericFunction(arguments);
  redisClient[foo].apply(arguments)
}

最佳答案

你问的当然是可能的,你需要做的只是花一些时间创建类来包装 redis 客户端以添加加密。据我所知,使用默认客户端 ( https://www.npmjs.com/package/redis ),没有简单的方法可以在将输入存储到 redis 之前修改输入,或者在从 GET 操作返回输出之前修改输出。

假设您仅将 redis 与 SET 和 GET 操作一起使用,您可以执行类似的操作。

我假设您在特定模块中有加密逻辑并且加密算法是同步的:

// encryption.js

"use strict";

function Encryption(key) {
  this.key = key;
}

Encryption.prototype.enc(value) {
  // Encrypts the value using the key and returns it...
}

Encryption.prototype.dec(value) {
  // Decrypts the value using the key and returns it...
}

module.exports = Encryption

我们的 redis 包装器将如下所示:

// encryptedRedisClient.js

"use strict";

function EncryptedRedisClient(redisClient, encryption)
{
  this.redisClient = redisClient;
  this.encryption = encryption;
}

EncryptedRedisClient.prototype.get(key, cb)
{
  this.client.get(key, function (err, reply) {
    if (err) {
      cb(err);
    }

    cb(null, this.encrypt.dec(reply.toString()));
  });
}

EncryptedRedisClient.prototype.set(key, value, cb)
{
  var encValue = this.encryption.enc(value); 
  this.client.set(key, encValue, cb);
}

module.exports = EncryptedRedisClient;

最后你可以像这样使用包装好的客户端:

"use strict";

var redis = require('redis');
var client = redis.createClient(); // add the needed options here
var Encryption = require('./encryption');
var EncryptedRedisClient = require('./encryptedRedisClient');

var encClient = new EncryptedRedisClient(client, new Encryption('some_secret_key'));

encClient.set(...);
encClient.get(...);

我没有测试过代码,所以可能存在一些小问题,但这应该是一个很好的起点。

关于node.js - 如何轻松包装整个 (Redis) 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36620194/

相关文章:

javascript - 从nodejs录制音频并流式传输到客户端

Node.js:在 OpenShift 上提供静态资源问题

node.js - 无法在 API Gateway 中使用自定义授权方

redis - GCP MemoryStore 上的数据迁移

node.js - AWS S3 按对象创建/修改日期降序排列所有对象 NodeJs

c++ - 函数和数组有问题

C 链接列表 - 理解,如何删除列表中的相同元素

c++ - 逻辑函数词典

c# - .Net Core 2.0 内部服务器错误与 Redis 缓存

redis - 如何在 Redis 中删除一个有分数的元素?