javascript - 如何在批量导入中使用sequelize findorcreate?

标签 javascript node.js asynchronous sequelize.js

我尝试在 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 中,您需要等到数据库事务完成才能开始导入下一个用户。

最简单的方法是 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。只需返回 promise findOrCreate 返回:

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

关于javascript - 如何在批量导入中使用sequelize findorcreate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50942594/

相关文章:

javascript - Webix 组件未刷新

javascript - 如何在 x 毫秒后隐藏工具提示

mysql - 为什么我的 React 应用程序(具有 Node 和 mysql 后端)可以在本地运行,但不能在 Heroku 上运行?

node.js - 订阅 key 空间通知时遇到问题

java - 效率 - 在等待变量更改的循环中使用 Thread.yield

javascript - 将按钮添加到新元素

javascript - Angular2 - 使用子组件作为属性的值

javascript - 使用现有的 winston 记录器

javascript - 等到处理完成后再导出 Node.js 模块?

java - 完成 future : whenCompleteAsync() does not let me re-throw an Exception