Одна из главных вещей, которую я вынес из своего буткемпа, — это Sequelize. Это замечательный инструмент, который устраняет SQL-часть взаимодействия с базой данных. Тем не менее, он также сопряжен с некоторыми причудливыми подводными камнями.

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

Вутс

Круговая зависимость — db.models

У вас есть две модели, определенные в двух разных файлах. Они оба требуют доступа к другому. Вы не можете просто требовать друг друга в соответствующих файлах, потому что это создаст циклическую зависимость. Что потом?
Вот что вы делаете.

В Model1 вы можете получить доступ к Model2, обратившись к ней как db.models.model2.
В Model2 вы можете получить доступ к Model1, обратившись к ней как db.models.model1.

BelongsToMany — посмотрите, какие классные методы вы получите!

Меня часто смущали все эти методы получения/установки, которые создаются при определении ассоциации, и какая модель их получает.
Быстрый ответ: Модель слева от определения ассоциации получает методы.

Например, у вас есть две модели — User и Project.
Их связь такова:
User.belongsToMany(Project, {through: ‘userprojectmap’});

Какие методы будут созданы и кто их получит?
Их получает пользователь, так как он находится слева от ассоциации.
Вот предоставленные методы и некоторые НЕ предоставленные.

console.log(`user1.getProject ${user1.getProject}`); // Undefined
console.log(`user1.getProjects ${user1.getProjects}`); // определено
console.log(`user1.setProject ${user1.setProject}`); // Undefined
console.log(`user1.setProjects ${user1.setProjects}`); // определено

// определено. Идентичен addProjects
console.log(`user.addProject ${user1.addProject}`);

// определено. Идентичен addProject
console.log(`user.addProjects ${user1.addProjects}`);

// определено. Идентичен removeProjects
console.log(`user.removeProject ${user1.removeProject}`);

// определено. Идентичен removeProjec
tconsole.log(`user.removeProjects ${user1.removeProjects}`);

Гочки

Почему мой скрипт не завершается — db.close()

Вы когда-нибудь делали простой тестовый сценарий, чтобы просто проверить модели?

db.sync({force: true})
.then(() =› {
console.log(‘db synced’);
})

Скрипт работает нормально, но не выходит. Раньше мне приходилось нажимать ctrl+c, чтобы закончить. Но что, если этот скрипт должен выполняться как шаг (т. е. после установки) в вашем package.json?
Простой ответ — вам не хватает db.close(). Этот простой однострочный код закроет соединение, и ваш скрипт завершит работу.

db.sync({force: true})
.then(() =› {
console.log('db synced');
db.close(); })

Найти или создать и не удается прочитать свойство «0» неопределенного

Я не могу сказать вам, сколько времени я потратил на устранение этой ошибки. Это было ПРОСТО ПРОСТО найтиИлиСоздать!
По сей день я все еще ненавижу человека, который все испортил для всех нас.

В конце концов, это из-за pg версии 7.x. Просто понизьте версию pg до 6.4.2, которая является последней безопасной версией, и эта ошибка исчезнет.
В этой ветке есть более подробная информация, если хотите.

Нулевой или пустой массив — вот в чем вопрос…..

У вас есть две модели, и вот их ассоциации

Student.belongsTo(School)
School.hasMany(Student)

Теперь, если вы используете Student.find и включаете School, что вы получите за школу, если найденному вами учащемуся не назначена школа?
Вы получите null, а имя атрибута будет student.school.

Но что, если вы используете School.find и включаете Student. Что вы получите за учащегося, если в школу, которую вы нашли, не назначен ни один учащийся?
Нет, это НЕ пустое значение и оно не находится в разделе school.student.
Вы получите пустой массив в разделе school.students. (hasMany == множественное число)

Это все на данный момент. Если бы я знал о вещах, которые я здесь упомянул, это сэкономило бы мне ЧАСЫ! Так что я надеюсь, что это, по крайней мере, сэкономит ВАМ часы.
Удачного сиквелинга!