node.js - Sequelize findOrCreate 循环找不到新创建的行?

标签 node.js sequelize.js

为简单起见,我将其简化。我需要根据字符串值(不能是主键/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/

相关文章:

javascript - 如何在构建时更改客户端 JS 内的 URL?

SQL插入同时检查其中一个键是否等于另一个表中的字段

node.js - 在 forEach 循环中运行 sequelize 查询。无法处理结果

javascript - 当我想用nodejs进行mysql插入时,为什么会出现解析错误

node.js - 我如何解释 NPM 中的一个包提示依赖项没有得到满足,而实际上它显然是满足的?

javascript - 如何从 Node.js 中的 base64 字符串发送表单数据中的文件?

javascript - Sequelize - 通过另一个表包含表

node.js - Sequelize 获取最近的位置获取点

javascript - Sequelize js upsert 控制主键是否为空

javascript - 使用 Angular 和套接字切换 HTML 元素