嗨,我正在尝试使用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取回数据后执行。我不想将函数存储为字符串,然后使用eval
或new Function
进行求值。
答案 0 :(得分:2)
JSON是一种将任意数据对象编码为字符串的方法,以后可以将其解析回其原始对象。因此,JSON仅编码“简单”数据类型:null
,true
,false
,Number
,Array
和Object
。
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()
非常危险,因此已被弃用。