У меня есть файл JSON из Spotify с объектами, которые представляют художников. Внутри этих объектов одним из свойств является «жанры», представляющие собой массив строк (жанров).
Я пытаюсь найти или создать эти жанры в MongoDB. Затем добавьте эти идентификаторы объектов в массив и передайте этот массив при создании объектов Artist.
Но мои исполнители создаются в БД до того, как будет завершен процесс поиска или создания для их жанров.
Таким образом, строка fillRest запускается перед fillGenres.
Я пытался перейти с Object.values.forEach на for..of, for..in, различные асинхронные операции, обещания, модулирующий код ...
В основном добавлено, жду везде, где смогу (большинство в неправильных местах, вероятно)
import * as data from '../spotify_data/artist_id.json';
async function fillGenres(array) {
const genreIDs = []; // array of genre object IDs I'm trying to put inside every appropriate artist
if (array !== 'undefined') {
for (const element of array) {
await Genre.findOrCreate({ name: element }, (err, result) => {
genreIDs.push(result._id);
});
}
}
return genreIDs;
}
async function fillRest(entry, genreIDs) {
const artist = {
name: entry.ArtistName,
genres: genreIDs,
spotifyID: entry.ArtistID,
popularity: entry.Popularity,
spotifyFollowers: entry.Followers,
};
Artist.create([artist])
.then((result) => {
console.log(result);
})
.catch((error) => {
console.log(error);
});
}
async function spotifySeed() {
const entries = Object.values(data);
for (const entry of entries) {
fillGenres(entry.Genres)
.then((genreIDs) => {
fillRest(entry, genreIDs); // this line gets executed before fillGenres above^ which is super weird
});
}
}
spotifySeed();
Художники добавляются в MongoDB с жанрами, установленными как [].
После этого я получаю вывод консоли с хорошими массивами genreID (которые должны были быть там, а не по жанрам).
Решено - РЕДАКТИРОВАТЬ
Спасибо всем, кто помог. Проблема была в findOrCreate, так как он не возвращал обещание. Я использовал этот пакет для мангуста, у которого есть Обещания (https://www.npmjs.com/package/mongoose-findorcreate).
И код теперь
if (Array.isArray(array)) {
// eslint-disable-next-line no-restricted-syntax
for (const element of array) {
await Genre.findOrCreate({ name: element })
.then((result) => {
genreIDs.push(result.doc._id);
});
}
}
и в SpotifySeed
const genreIDs = await fillGenres(entry.Genres);
await fillRest(entry, genreIDs);