Node + Sequelize:如何在添加之前检查项目是否存在? (异步混淆)

时间:2015-08-04 16:55:11

标签: javascript node.js asynchronous sequelize.js async.js

不幸的是,我对节点不熟悉,并且对节点的异步/同步执行产生了一些困惑。

我正在使用node,sequelize with sqlite和async.js。

我有一系列Articles,每个Authors都有Authors

对于每个Article中的每个Author,我想检查authors = ['A. Test', 'B. Test', 'C. Test', 'A. Test']是否存在。如果没有,请创建它。

问题是,在初始运行时,正在创建重复的作者,我假设由于异步功能导致检查存在的问题。

例如,使用数组:async.each(authors, function(item, callback){ Author.sync().then(function(){ Author.count({ where: {name: item.trim()} }).then(function(count){ if (count != 0) { console.log('Author already exists') } else { console.log('Creating author...') Author.create({ name: item.trim() }) } }) }) })

和代码:

ID | name
------------
0  | A. Test
1  | B. Test
2  | C. Test
3  | A. Test

在第一次运行时,将创建一个表:

async.eachSeries(authors, function(authorName, callback){
    Author.findOne({ where: {name: authorName.trim()} }).
    then(function(author){
      if (author) {
        // Author exists...
        callback()
      } else {
        // Author does not exist...
        Author.create({
          name: authorName.trim()
        }).then(function(author){
          callback()
        })
      }
    })
  })

我做错了什么?我似乎错过了Node中异步与同步执行的基本概念。

(我也尝试过async.eachSeries,它应该是串行执行而不是并行执行?)

编辑:略有重构,但仍会创建重复

id

2 个答案:

答案 0 :(得分:13)

Author.count并非真正需要,除非您需要计数。请参阅findOrCreate()

使用findOrCreate(),您可以拥有以下内容。 (编辑trex005及其代码片段)



async.eachSeries(authors, function(item, callback) {
  Author.sync().then(function() {
    Author.findOrCreate({
      where: {
        name: item.trim()
      },
      defaults: { // set the default properties if it doesn't exist
        name: item.trim()
      }
    }).then(function(result) {
      var author = result[0], // the instance of the author
        created = result[1]; // boolean stating if it was created or not

      if (!created) { // false if author already exists and was not created.
        console.log('Author already exists');
      }

      console.log('Created author...');
      callback();
    });
  })
})




答案 1 :(得分:0)

将您的每个更改为eachSeries并实际调用回调,您应该是金色的。

async.eachSeries(authors, function(item, callback){
    Author.sync().then(function(){
      Author.count({ where: {name: item.trim()} }).then(function(count){
        if (count != 0) {
          console.log('Author already exists')
          callback(); //assuming you want it to keep looping, if not use callback(new Error("Author already exists"))
        } else {
          console.log('Creating author...')
          Author.create({
            name: item.trim()
          }).then(function(author){
            callback();
          })
        }
      })
    })
  })