Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Sequelize findOrCreate循环找不到新创建的行?_Node.js_Sequelize.js - Fatal编程技术网

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

Node.js Sequelize findOrCreate循环找不到新创建的行?,node.js,sequelize.js,Node.js,Sequelize.js,为了简单起见,我将把这个问题简化。我需要根据字符串值(不能是主键/id)查找或创建行。它必须在循环中完成,所以它必须是异步的。表中可能已经存在一个值 假设我有这样一个数组: const arrayOfArtistNames = ['Eminem', 'Eminem', 'Eminem', 'Biggie', 'Dr. Dre', 'Dr. Dre', 'Biggie'] arrayOfArtistNames.map(name => findOrCreateArtist(name)) c

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

它重复了多少次,重复了多少次,似乎没有任何押韵或理由


如何让sequelize findOrCreate检查我们刚刚创建的值?是否有某种异步钩子或选项我没有在查询中抛出?

async wait
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);

工作得很有魅力。谢谢Vivek!嘿,在某些情况下,这实际上仍然不起作用。假设我正在尝试更新一个key_count变量,因此每次迭代一个唯一的keyname时,数据库计数应该增加一个。在我的例子中,Eminem应该在+3之前更新,但实际上只更新一次(我认为查询发生得太快太同步了?)。
const data = await Promise.all(arrayOfArtistNames.map(name => findOrCreateArtist(name)));
console.log(data)