使用Node.js在JSON Redis中设置函数类型

时间:2019-01-14 12:35:14

标签: node.js json redis ioredis

嗨,我正在尝试使用ioredis将JSON存储在Redis中。该JSON也包含一个函数。我的json的结构类似于:

var object = {
  site1: {
    active: true,
    config1:{
      // Some config in JSON format
    },
    config2: {
      // Some other config in JSON format
    },
    determineConfig: function(condition){
      if(condition) {
        return 'config1';
      }
      return 'config2';
    }
  }
}

我正在使用IOredis将这个json存储在redis中:

redisClient.set(PLUGIN_CONFIG_REDIS_KEY, pluginData.pluginData, function (err, response) {
  if (!err) {
    redisClient.set("somekey", JSON.stringify(object), function (err, response) {
      if (!err) {
        res.json({message: response});
      }
    });
  }
});

在执行此操作时,determineConfig键从object处被截断,因为如果类型为函数,JSON.stringify会将其删除。有什么方法可以将该函数存储在redis中,并在我从redis取回数据后执行。我不想将函数存储为字符串,然后使用evalnew Function进行求值。

1 个答案:

答案 0 :(得分:2)

JSON是一种将任意数据对象编码为字符串的方法,以后可以将其解析回其原始对象。因此,JSON仅编码“简单”数据类型:nulltruefalseNumberArrayObject

JSON不支持任何具有专用内部表示形式的数据类型,例如Date,Stream或Buffer。

要查看实际效果,请尝试

 typeof JSON.parse(JSON.stringify(new Date)) // => string

由于无法将其基础二进制表示形式编码为字符串,因此JSON不支持Function的编码。

JSON.stringify({ f: () => {} }) // => {}

虽然您表示不希望这样做,但是实现目标的唯一方法是将函数序列化为其功能的源代码(由字符串表示),如下所示:

const determineConfig = function(condition){
  if(condition) {
    return 'config1';
  }
  return 'config2';
}

{
  determineConfig: determineConfig.toString()
}

然后exec或在接收端重新实例化该功能。

我建议您不要这样做,因为exec()非常危险,因此已被弃用。