node.js objectmapper字符串到javascript对象

时间:2017-05-31 04:39:21

标签: node.js javascript-objects

使用object-mapper node.js模块将对象映射到另一个。

var objectMapper = require('object-mapper');
var map = {"foo": [{ key:"newfoo", transform: function(value){ return "##"+value;  }}]}
var data =  {"foo":"bar","baz":"blah"}
var dest = objectMapper(data, map);

变量map是动态的,会根据场景情况而有所不同。 所以我可以有另一个翻译

{"foo": [{ key:"newfoo", transform: function(value){ return "$$"+value;  }}]}

我通过创建一个javascript文件map_tmpl.js

来保存所有模板
var tmpl_1= function () {return {"foo": [{ key:"newfoo", transform: function(value){ return "##"+value;  }}]};}
var tmpl_2= function () {return {"foo": [{ key:"newfoo", transform: function(value){ return "##"+value;  }}]};}
module.exports= {tmpl_1,tmpl_2}

我想将这些模板保存在数据库中,并在需要时从数据库中读取, 如果我将其存储为字符串并将其传递给objectmapper,则对象映射器不能正常工作,因为它需要一个对象,请提供最佳解决方法的建议。

1 个答案:

答案 0 :(得分:1)

由于JSON对功能一无所知,因此您必须使用自定义序列化器&用于存储输入/输出数据库的反序列化器。

var serializer = function(key, val) {
   if (typeof val === 'function') return val + '';      /* serialize function to string */
   return val;
};

var deserializer = function(key, val) {
   var reg = /^function\s*\(/;      /* match function string and deserialize back to function */
   if (typeof val === 'string' && reg.test(val)) {
      eval(`var fn = ${val}`);
      return fn;
   }
   return val;  
}

以你的代码为例:

1)保存到数据库

var tmpl_1= function () {return {"foo": [{ key:"newfoo", transform: function(value){ return "##"+value;  }}]};}
var StringIntoDatabase = JSON.stringify(tmpl_1, serializer);

2)从数据库中取出

var tmpl_1 = JSON.parse(StringFromDatabase, deserializer);

控制台快照: enter image description here