Nodejs中Redis保存Javascript类实例是否会连同原型上定义的方法一并保存?

Nodejs中Redis保存Javascript类实例是否会连同原型上定义的方法一并保存?

先定义一个“类”:


function User(obj) {
    for (var key in obj) {
        this[key] = ojb[key];
    }
}

再在原型上定义一个方法,该方法会将实例自身保存到 redis 里:

User.prototype.save = function(){
    redis_client.hmset('user111', this);
};

测试:

var tobi = new User({
    name: 'Tobi',
    pass: 'secret-passwd',
    age: '2'
});

tobi.save();

然后去到 redis-cli 里输出该对象,会发现连同原型上的 save 函数也保存了:

$ redis-cli

redis> hgetall user111

… 5) “pass” 6) “secret-passwd” 7) “age” 8) “2” … 13) “save” 14) "function (){\r\n …

请注意上面输出的 13), 14) 部分,正是在原型上定义的方法。

这其实是《 Nodejs 实战》书里的一个例子,书里的输出是没有原型上的方法的,只保存了实例属性。我这里的输出为什么有原型方法呢?


4 回复

可能是你用的 redis 库有更新。不过 redis 里存的都是字符串,所以一般也没人这么用。


关键看这个库的序列化方法吧,和 redis 没关系。

感谢!经你的提醒,我刚刚安装了和书上一样版本(旧)的 redis 库,测试下来果然没有保存 save 方法,确实是因为库更新造成的。

在Node.js中使用Redis保存JavaScript类实例时,通常不会直接保存类的实例及其原型上定义的方法。Redis是一个键值存储系统,主要设计用于存储字符串、哈希、列表、集合等数据结构,而不是直接存储JavaScript对象。

当你尝试将JavaScript对象(包括类的实例)保存到Redis时,通常会先将对象序列化为JSON字符串(或其他格式),然后再存储。由于JSON序列化只包含对象的可枚举属性,不包括函数或原型链上的方法,因此原型上的方法不会被保存。

以下是一个简单的示例,展示了如何将类的实例序列化为JSON并保存到Redis中:

const redis = require('redis');
const client = redis.createClient();

class MyClass {
  constructor(name) {
    this.name = name;
  }

  greet() {
    return `Hello, ${this.name}!`;
  }
}

const instance = new MyClass('Alice');
const jsonString = JSON.stringify(instance); // 只包含name属性

client.set('myKey', jsonString, redis.print);

client.get('myKey', (err, reply) => {
  if (err) throw err;
  const parsedObject = JSON.parse(reply);
  console.log(parsedObject); // { name: 'Alice' },没有greet方法
});

client.quit();

在这个例子中,greet方法不会被保存到Redis中,因为JSON序列化过程中忽略了它。如果你需要保存和恢复函数,你可能需要实现自定义的序列化和反序列化逻辑。

回到顶部