我正在尝试在CSV导入中使用findOrCreate函数,以防止使用相同的电子邮件地址创建多个用户,但此方法不起作用。

我将CSV文件中的所有行导入到内存中:

importableCsvRows.forEach(row => importData(row))


然后,我遍历每一行以导入用户:

function importData (row) {
  const name = row[0]
  const email = row[1]
  addUser(name, email)
}


在addUser函数中,我使用findOrCreate:

function addUser (name, email) {
  return new Promise(function (resolve, reject) {
    const user = models.users.findOrCreate({
      where: {email: email},
      defaults: { email: email, name: name }
    })
    .then(u => {
      return resolve(u)
    })
    .catch(err => {
      console.log('ERROR', err)
      return reject(err)
    })
  })
}


问题在于,由于findOrCreate是异步的,因此开始多个事务,因此在第一行完成处理之前,下一行开始。

最佳答案

forEach内部,您需要等待db事务完成之后才能开始导入下一个用户。

最简单的方法是await importData函数:

async function importData (row) {
  const name = row[0]
  const email = row[1]
  try {
    await addUser(name, email)
  } catch(err) {
    //console.log?
  }
}


另外,在addUser中:无需返回您自己的Promise。只需返回诺言findOrCreate返回:

function addUser (name, email) {
    return models.users.findOrCreate({
      where: {email: email},
      defaults: { email: email, name: name }
    })
  })
}

10-05 20:50