Migreringar
Jag skulle föreslå att du använder sequelize migrationer
gör istället sync()
på varje modell. Det finns en modul - sequelize.cli
som gör att du enkelt kan hantera migrationer och frön. Det tvingar på något sätt fram en projektstruktur genom att skapa initialiseringsfilen index.js
inuti /models
katalog över projektet. Det förutsätter att alla dina modelldefinitioner kommer att finnas i den här katalogen. Detta skript itererar genom alla modellfiler (varje modelldefinition finns i en separat fil, t.ex. mentee.js
, question.js
) och utför sequelize.import()
för att tilldela dessa modeller till sequelize-instansen - detta låter dig komma åt dem senare via sequelize[modelName]
t.ex. sequelize.question
.
Obs! när du skapar migreringsfiler kom ihåg tidsstämpelfälten - createdAt
, updatedAt
och så småningom deletedAt
.
Synkronisera
Personligen använder jag sync()
bara när jag kör testerna - detta kan visas i tre steg
- utför
sequelize.sync({ force: true })
för att synkronisera alla modeller - kör några databas-
seeds
(kan också göras viasequelize-cli
), - kör tester.
Detta är mycket bekvämt eftersom det låter dig rengöra databasen innan du kör tester, och för att skilja utveckling från tester kan tester använda olika databas, t.ex. project_test
, så att utvecklingsdatabasen förblir intakt.
Många-till-många
Låt oss nu gå vidare till ditt problem - m:n relation mellan två modeller. Först och främst på grund av det faktum att du utför Promise.all()
, sync
kan köras i annan ordning än du lägger till funktionerna i den. För att undvika denna situation föreslår jag att du använder mapSeries
funktion hos Bluebird
lova, som Sequelize använder och exponerar under sequelize.Promise
(detta är också anledningen till ditt senaste fel om att ta bort överordnad rad - du försöker ta bort mentees
som refereras från menteequestion
).
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
Första parametern i mapSeries
är en rad löften, men den andra är en funktion som körs med resultatet av varje tidigare definierat löfte. På grund av det faktum att Model.sync()
resulterar i själva modellen kan vi utföra model.destroy()
vid varje iteration.
Efter det kan du infoga lite data i databasen via create()
, precis som i exemplet. Nu är det dags att åtgärda Fel:adepten är inte kopplad till adeptfrågan! fel. Det beror på att du har kopplat Mentee
med Question
men det finns ingen koppling mellan MenteeQuestion
och Mentee
(eller Question
). För att fixa det, efter belongsToMany
, kan du lägga till
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
Nu kan du lägga till include: [Mentee, Question]
när du frågar MenteeQuestion
. Du skulle också köra på ett annat fel när du gjorde toJSON()
, eftersom du gör findAll
som returnerar en mängd instanser. Du kan göra forEach()
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});