使用sequelize在模型/实例中存储和检索JSON对象

我正在寻求利用一个大项目的续集,并希望我可以用它来存储一个JSON对象作为一个模型中的属性。

我觉得我正在为此而挣扎,但也许我错过了一些简单的东西?

我正在定义一个模型( Context )如下:

 var contextProperties = { contextName: { type: Sequelize.STRING, validate: { is: ["[az]",'i'], notEmpty: true } }, _trackList: {type: Sequelize.TEXT}, trackList: {type: Sequelize.TEXT} } var contextGetSet = { getterMethods: { trackList: function(){ return JSON.parse(this._trackList); } }, setterMethods: { trackList: function(v){ this._trackList = JSON.stringify(v); } } }; var Context = sequelize.define('Context', contextProperties, contextGetSet); 

现在,当我创build我的Context ,似乎在我保存之前工作。

 var contextMain; Context.create({contextName: "Whatever"}).success(function (context){ contextMain = context; contextMain.trackList = { atrackList: "1111", anotherTrackList: 2872 }; console.log(constextMain.trackList); //logs { atrackList: "1111", anotherTrackList: 2872 } as expected contextMain.save().success(function (contextSaved){ console.log(contextSaved.values); //all values are null except for the contextName }); }); 

所以JSON IS设置正确,但save().success()方法返回的对象似乎没有我设置的正确值。

当我loggingsave().success()方法(即contextSaved.values )返回的对象时,对象如下所示:

 { contextName: 'Whatever', _trackList: 'null', trackList: null, id: 6, createdAt: Fri Dec 06 2013 15:57:39 GMT-0500 (EST), updatedAt: Fri Dec 06 2013 15:57:39 GMT-0500 (EST) } 

一切都是空的!

更奇怪的是,当我看着保存contextMain的保存SQL查询,它似乎是节省的权利!

 Executing: UPDATE "Contexts" SET "contextName"='Whatever', "_trackList"='{"atrackList":"1111","anotherTrackList":2872}', "trackList"=NULL,"id"=7, "createdAt"='2013-12-06 20:59:39.278 +00:00', "updatedAt"='2013 -12-06 20:59:39.294 +00:00' WHERE "id"=7 RETURNING * 

注意: "_trackList"='{"atrackList":"1111","anotherTrackList":2872}'

另外,当我看着它的实际SQL行, 它确实有string化的JSON对象在那里

如果我使用sequelize加载上下文虽然…

 Context.findAll().success(function(contexts) { console.log(JSON.stringify(contexts)) // also displays null for _trackList and trackList }); 

所以很奇怪。 任何帮助非常感谢! 非常感谢! 对不起,这篇文章太长了!

这显然是一个与对象的getters和setter错误,最近解决: https : //github.com/sequelize/sequelize/issues/759

你能检查运行JSON.stringify的setterMethod是否被调用? 也许它试图插入作为一个对象不是一个string?

更广泛地说,你考虑过MongoDb吗? 也许还有其他的原因,为什么它不吸引你,但从这个项目的一瞥,它看起来会有真正的优势 – 主要不需要parsingJSON在两个方向…但除此之外, d能够使用该对象内的值执行查询之类的事情,稍后可能会有用。