Установка типа функции в JSON redis с использованием nodejs - PullRequest
0 голосов
/ 14 января 2019

Привет. Я пытаюсь сохранить JSON в Redis с помощью ioredis. Этот 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. Я не хочу сохранять функцию в виде строки, а затем использовать eval или new Function для оценки.

1 Ответ

0 голосов
/ 14 января 2019

JSON - это средство для кодирования произвольных объектов данных в строки, которые могут быть впоследствии проанализированы в исходном объекте. Таким образом, JSON кодирует только «простые» типы данных: null, true, false, Number, Array и Object.

JSON не поддерживает какие-либо типы данных, которые имеют специализированное внутреннее представление, например Date, Stream или Buffer.

Чтобы увидеть это в действии, попробуйте

 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() очень опасен и поэтому устарел.

...