为什么我会收到以下Redis警告和错误?

时间:2019-04-11 00:04:00

标签: node.js redis

当我尝试将以下数据保存到Redis时:

{ _id: 5c9535a742e1ce2b2ce90be5,
  email: 'admin@admin.com',
  items:
   [ { _id: 5c9535c042e1ce2b2ce90be6, product: [Object], quantity: 1 },
     { _id: 5c9535c642e1ce2b2ce90beb, product: [Object], quantity: 1 } ],
  createdOn: 2019-03-22T19:21:11.349Z,
  __v: 0 }

我收到以下警告:

node_redis: Deprecated: The SETEX command contains a argument of type model.
This is converted to "{ _id: 5c9535a742e1ce2b2ce90be5,
  email: 'admin@admin.com',
  items:
   [ { _id: 5c9535c042e1ce2b2ce90be6, product: [Object], quantity: 1 },
     { _id: 5c9535c642e1ce2b2ce90beb, product: [Object], quantity: 1 } ],
  createdOn: 2019-03-22T19:21:11.349Z,
  __v: 0 }" 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检索数据时,出现以下错误:

undefined:1
  { _id: 5c9535a742e1ce2b2ce90be5,
    ^
  SyntaxError: Unexpected token _ in JSON at position 2
   at JSON.parse (<anonymous>)

用于保存到Redis的函数:

exports.setCart = (email, cart) => {
    cart - JSON.stringify(cart);
    redisClient.setex(email, CACHE_TTL, cart);
}

用于从Redis检索数据的函数:

exports.getCart = (email, callback) => {
    redisClient.get(email, (err, cart) => {
        if(err) {return callback(err, null)}

        console.log('CART FROM CACHE ', cart)
    return callback(err, JSON.parse(cart));
    })
}

用于将数据保存到Redis的函数调用:

redisClient.setCart(email, cart);

2 个答案:

答案 0 :(得分:1)

我认为redis不能直接处理JSON对象-特别是嵌套的JSON。您可以将一个简单的JSON对象存储为哈希(简单来说,这是一个平面JSON,没有包含其他嵌套JSON对象的属性)。

最简单的解决方案是在存储所有内容之前先JSON.stringify(),然后在检索它们时JSON.parse()

如果您的对象不是太大,那还是不错的,这很好。另一种选择是使用flat npm软件包,该软件包基本上将嵌套的JSON扁平化,以便可以将它们存储为哈希值。您可以在this中等文章中查看有关此内容的更多信息。

答案 1 :(得分:0)

对不起,伙计们,简单的语法错误:

cart - JSON.stringify(cart);

应该是:

cart = JSON.stringify(cart);