Sequelize «raw = true» изменяет имя атрибута модели json с помощью точки

#node.js #sequelize.js

#node.js #sequelize.js

Вопрос:

У меня есть модель содержимого, и в ней есть много элементов дополнительного содержимого, например;

 const content = await db.Content.findOne({
    where: {
        permalink: req.params.permalink
    },
    include: [{
        model: db.ContentImages
    }]
    raw: true
});
  

Как вы знаете raw:true , скрытое продолжение зависит от объектной модели. У меня есть некоторые проблемы в этом пункте.

Если я использую raw:true , модель json показывает мне вот так;

 {
  "id": 4706,
  "name": "Content Title",
  "content": "Content detail",
  "t_content_images.id": 7633,
  "t_content_images.content_id": 4706,
  "t_content_images.image": "content-image-1.jpg",
  "t_content_images.order_no": 1
}
  

Из-за expressjs мне нужна такая модель, а не SequelizeInstance;

 {
  "id": 4706,
  "name": "Content Title",
  "content": "Content detail",
  "t_content_images": {
    "id": 7633,
    "content_id": 4706,
    "image": "content-image-1.jpg",
    "order_no": 1
  }
}
  

Другая проблема, у меня есть несколько изображений содержимого, и если я использую, как указано выше, первый образец, он возвращает мне только первое изображение содержимого.

Ответ №1:

Вы думаете об этом немного назад — когда вы используете raw: true его, он не преобразует его из объекта JSON в экземпляр модели.

Если вы подумаете о том, как структурируются результаты SQL, они всегда возвращаются плоскими. Это означает, что для объединений, в которых у вас есть одна базовая запись, связанная с несколькими дочерними элементами ( Content -< ContentImages в данном случае), результаты SQL будут повторять информацию для базовой записи для каждого из дочерних элементов. Sequelize преобразует это в объект JSON, который вы видите в первом примере в вашем вопросе. Если вы оставите raw: true это, он сделает еще один шаг и проанализирует его в экземпляре вашей модели. Затем вы можете вызвать Model.toJSON() , чтобы получить JSON-представление анализируемого объекта.

Учитывая вышесказанное, если вы извлекаете много дочерних элементов, то может быть более эффективным получить данные в двух запросах вместо одного, чтобы вам не приходилось отправлять повторяющиеся данные клиенту.

Комментарии:

1. «Затем вы можете вызвать Model.toJSON(), чтобы получить представление анализируемого объекта в формате JSON». это решило мою проблему. Он преобразовал SequelizeInstance в объект JSON. Спасибо за ваше время.