使用 nodejs 在 JSON redis 中设置函数类型



嗨,我正在尝试使用 ioredis 在 redis 中存储 JSON。此 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进行评估。

JSON 是一种将任意数据对象编码为字符串的方法,这些字符串可以在以后的某个时间解析回其原始对象。因此,JSON只编码"简单"数据类型:nulltruefalseNumberArrayObject

JSON 不支持任何具有专用内部表示形式的数据类型,例如日期、流或缓冲区。

要查看此操作的实际效果,请尝试

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

由于它们的底层二进制表示形式无法编码为字符串,因此 JSON 不支持函数编码。

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

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

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

并在接收端exec或以其他方式重新实例化函数。

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

相关内容

  • 没有找到相关文章

最新更新