无法解析

时间:2017-02-06 17:32:59

标签: sequelize.js

你在做什么?

嗨,我正在尝试从数据库中获取一组对象。

模型

checklist: {
 type: DataTypes.ARRAY(DataTypes.JSON),
 allowNull: true,
 defaultValue: []
}

查询

return Note.findAll({
  order: '_id ASC',
  attributes: [
   '_id',
   'checklist'
  ]
})

您期望发生什么?

像这样的对象:

"checklist": [
    {checked: true, text: "Shortening"},
    {checked:true, text: "Margarine"},
    {checked:false, text: "Canned Stewed Tomatoes"},
    {checked:true, text: "Onions"}
  ]

实际发生了什么?

我得到一个字符串数组

"checklist": [
    "{\"checked\":true,\"text\":\"Shortening\"}",
    "{\"checked\":true,\"text\":\"Margarine\"}",
    "{\"checked\":false,\"text\":\"Canned Stewed Tomatoes\"}",
    "{\"checked\":true,\"text\":\"Onions\"}"
  ]

附加

我尝试使用getter和setter,因为它可以正常工作,但是当我尝试更新元素时​​会抛出错误。 谢谢!

修改

现在我可以使用JSON.parse()解析数据,现在的问题是我正在更新某些内容。这就是sequelize做的事:"checklist"=ARRAY['{"checked":true,"text":"Shortening"}','{"‌​checked":true,"text"‌​:"Margarine"}','{"ch‌​ecked":false,"text":‌​"Canned Stewefd Tomatoes"}','{"checked":true,"text":"Onions"}']::JSON[]

这个带有此文本的返回错误500:

SyntaxError: Unexpected token o in JSON at position 1

最终编辑

在yoogeeks检查评论后,我决定在模型中创建一个getter函数

checklist: {
      type: DataTypes.ARRAY(DataTypes.JSON),
      allowNull: true,
      defaultValue: [],
      get() {
        const data = this.getDataValue('checklist');
        const toSend = [];
        data.forEach(val => {
          toSend.push(JSON.parse(val));
        });
        return toSend;
      }
    },

这适用于GET但是当我尝试更新某些记录时,它仍会抛出错误。最后,我决定做一点检查,以确定清单字段是否为字符串。

checklist: {
      type: DataTypes.ARRAY(DataTypes.JSON),
      allowNull: true,
      defaultValue: [],
      get() {
        const data = this.getDataValue('checklist');
        const toSend = [];
        data.forEach(val => {
          toSend.push(typeof val === 'string' ? JSON.parse(val) : val);
        });
        return toSend;
      }
    },

这很有效。

我不知道为什么会发生这种情况,但我的理论是,当我更新sequelize时,转到模型并进行另一个GET以返回数据,但是当它执行此操作时,检查表字段仍然是一个数组而不是字符串,所以这就是为什么我得到SyntaxError: Unexpected token o in JSON at position 1。如果有人知道什么是好的学习:)

非常感谢!!

方言: postgres Sequelize版本: 3.23.6

1 个答案:

答案 0 :(得分:0)

在yoogeeks检查评论后,我决定在模型中创建一个getter函数

checklist: {
      type: DataTypes.ARRAY(DataTypes.JSON),
      allowNull: true,
      defaultValue: [],
      get() {
        const data = this.getDataValue('checklist');
        const toSend = [];
        data.forEach(val => {
          toSend.push(JSON.parse(val));
        });
        return toSend;
      }
    },

这适用于GET但是当我尝试更新某些记录时,它仍会抛出错误。最后,我决定做一点检查,以确定清单字段是否为字符串。

checklist: {
      type: DataTypes.ARRAY(DataTypes.JSON),
      allowNull: true,
      defaultValue: [],
      get() {
        const data = this.getDataValue('checklist');
        const toSend = [];
        data.forEach(val => {
          toSend.push(typeof val === 'string' ? JSON.parse(val) : val);
        });
        return toSend;
      }
    },

这很有效。

我不知道为什么会发生这种情况,但我的理论是,当我更新sequelize时,转到模型并进行另一个GET以返回数据,但是当它执行此操作时,检查表字段仍然是一个数组而不是字符串,所以这就是为什么我在位置1的JSON中获取SyntaxError:Unexpected token o。如果有人知道究竟是什么将是很好的学习:)