node.js - Sequelize findOrCreate 循环找不到新创建的行?
问题描述
为简单起见,我将其简化。我需要根据字符串值(不能是主键/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 检查我们刚刚创建的值?是否有某种我没有在查询中抛出的异步钩子或选项?
解决方案
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)
推荐阅读
- php - 纯php阻止html输入保存到文本文件中
- python - 通过模拟使用 Python 日志记录
- angular-material-8 - 未应用 Angular 预建主题
- javascript - 为什么最后一个 .then 在承诺链中起作用
- reactjs - 导入 3rd 方库时的 CommonJS 汇总插件语法错误,主要与“进程”有关
- javascript - 无法在 owl-carousel 中添加数据,并且数据在 Spring Boot、JSP、Ajax 中应该是可重复的
- javascript - Reprezente 对 bar char 投票
- javascript - Javascript中的闰年问题使用嵌套的if-else
- mongodb-query - CosmosDB mongoDB API 排序和全文搜索抛出错误
- html - 如何将 CSS 过渡添加到仅用于转换图像的产品项目