为简单起见,我将其简化。我需要根据字符串值(不能是主键/ID)来查找或创建行。它必须在一个循环中完成,所以它必须是异步的。其中一个值也可能已经存在于我们的表中。
假设我有一个这样的数组:
const arrayOfArtistNames = ['Eminem', 'Eminem', 'Eminem', 'Biggie', 'Dr. Dre', 'Dr. Dre', 'Biggie']
arrayOfArtistNames.map(name => findOrCreateArtist(name))
const findOrCreateArtist = async (artist_name) => {
return await ArtistIA.findOrCreate({
where: {
artist_name: artist_name
},
defaults: {
artist_bio: ""
}
}).then((response) => {
response = JSON.parse(JSON.stringify(response));
return response[0];
}).catch(err => {
console.log("uploads.js", 273, err);
});
};
我的问题是我的数组中有多个重复值。并且当数组获得“Eminem”的第二次迭代时,它不是从字面上找到刚刚创建的行 sequelize,而是创建另一个。
它重复了多少次和多少次似乎没有任何押韵或理由。
我如何告诉 sequelize findOrCreate 检查我们刚刚创建的值?是否有某种我没有在查询中抛出的异步钩子(Hook)或选项?
最佳答案
async await
无法在 map/forEach...
中使用,你必须使用简单的 for 循环:
const arrayOfArtistNames = ['Eminem', 'Eminem', 'Eminem', 'Biggie', 'Dr. Dre', 'Dr. Dre', 'Biggie']
const ArtistObjects = [];
for(let i = 0 ; i < arrayOfArtistNames.length ; i++) {
ArtistObjects.push(await findOrCreateArtist(arrayOfArtistNames[i]));
}
console.log(ArtistObjects);
或
const data = await Promise.all(arrayOfArtistNames.map(name => findOrCreateArtist(name)));
console.log(data)
关于node.js - Sequelize findOrCreate 循环找不到新创建的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599494/