使用sequelize在Model / Instance中存储和检索JSON对象

时间:2013-12-06 21:07:45

标签: json node.js sequelize.js

我希望在一个大项目中使用sequelize,并且希望我可以使用它来将JSON对象存储为模型中的属性。

我觉得我正在努力解决这个问题,但也许我错过了一些简单的事情?

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

var contextProperties = {

  contextName: { type: Sequelize.STRING, validate: { is: ["[a-z]",'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);

现在,当我创建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()方法返回的对象似乎没有我设置它的正确值。

当我记录save().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行时,它确实有字符串化的JSON对象

如果我使用sequelize加载Context但是......

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

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

2 个答案:

答案 0 :(得分:3)

这显然是对象的getter和setter的错误,并且最近解决了: https://github.com/sequelize/sequelize/issues/759

答案 1 :(得分:0)

你能检查一下运行JSON.stringify的setterMethod是否被调用了吗?也许它试图插入对象而不是字符串?

更广泛地说,你考虑过MongoDb吗?可能有其他原因导致它没有吸引你,但只是从这个项目的一瞥,看起来它会有真正的优势 - 主要是不必在两个方向解析json ......但除此之外你' d能够使用该对象内的值进行查询,这可能会在以后证明是有用的。