如何在node.js redis中替换过时的HMSET

vsnjm48y  于 2022-09-21  发布在  Node.js
关注(0)|答案(3)|浏览(276)

Redis命令HMSET从版本4开始就是deprecated。他们建议改用HSET。但当我尝试这样做时,我得到了一个不同的反对警告。我使用的是:db.hmset('key', {a: 1, b: 'c'})。现在我尝试用db.hset替换它,但这会触发:

node_redis: Deprecated: The HSET command contains a argument of type Object.
This is converted to "[object Object]" by using .toString() now and will return an error from v.3.0 on.
Please handle this in your code to make sure everything works as you intended it to.

在Redis数据库中存储对象的正确方式是什么?

Redis HSET的文档指出:“从Redis 4.0.0开始,HSET是可变的,并允许多个字段/值对。”我希望存储整个对象,就像它在数据库中使用hmset一样,而不是它的字符串表示。

2ic8powd

2ic8powd1#

正如这里所描述的,Redis客户端不支持命令参数中的对象。

要以redis轻松存储对象,您可以执行以下操作:

db.hset('key', ...Object.entries({a: 'a', b: 'b'}), (err) => {
  // ...
});

请注意,它将忽略Symbol键,并且只对“平面对象”起作用。

1hdlvixo

1hdlvixo2#

看来hset的第二个参数必须是一个字符串。如果不是.toString,将对其应用。但在您的情况下,由于它将返回"[object Object]",因此会触发警告。可以改用JSON.stringify({a: 1, b: 'c'})作为参数

cuxqih21

cuxqih213#

对于那些使用类型脚本的人,hSet的第二个参数可以是这种类型的字符串数组[‘k1’,‘v1’,‘k2’,‘v2’,...]。因此,以下代码可以工作:

const obj: Record<string, string | number> = {a: 'a', n: 1};
await client.hSet('key', [...Object.entries(obj).flat()]);

相关问题