我正在尝试在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 }
})
})
}