GOOGLE ADS

mardi 26 avril 2022

Sequelize méthode magique retournant null

Juste un peu confus quant à la raison pour laquelle cette méthode magique renvoie null. C'est probablement très simple, mais j'utilise des méthodes que je n'utiliserais pas normalement (bulkingCreating) et je ne peux pas le voir actuellement.

Association:Country.hasOne(Capital, { foreignKey: 'countryId' });

Remplir des données factices :

 const countries = await Country.bulkCreate([
{ name: 'England' },
{ name: 'Spain' },
{ name: 'France' },
{ name: 'Canada' }
]);
const capitals = await Capital.bulkCreate([
{ name: 'London' },
{ name: 'Madrid'},
{ name: 'Paris' },
{ name: 'Ottawa' }
]);
countries.forEach((country, index) => {
country.setCapital(capitals[index]);
});
const country = await Country.findOne({where: {name: 'Spain'}});
console.log(country.name, Object.keys(country.__proto__)); // Spain / magic methods
const capital = await country.getCapital();
console.log(capital); // null

La table:

Table

Ai-je tort de penser que je country.getCapital()devrais renvoyer l'entrée pertinente ?


Solution du problème

Comme vous pouvez le deviner setCapital, il devrait s'agir d'une fonction asynchrone car elle apporte des modifications à la base de données, vous devez donc utiliser à la forplace d' une forEachméthode qui ne prend pas en charge les rappels asynchrones :

let index = 0;
for (const country of countries) {
await country.setCapital(capitals[index]);
index += 1;
}

Il serait préférable de créer les pays un par un et de créer des capitales pour eux en ne s'appuyant pas sur les mêmes index des deux collections (la base de données peut renvoyer les enregistrements créés dans un ordre différent).

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...