嗨,我正在尝试使用 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 取回数据后将其执行。我不想将函数存储为字符串,然后使用eval
或new Function
进行评估。
JSON 是一种将任意数据对象编码为字符串的方法,这些字符串可以在以后的某个时间解析回其原始对象。因此,JSON只编码"简单"数据类型:null
、true
、false
、Number
、Array
和Object
。
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()
非常危险,因此已被弃用。