I am unfortunately new to node and running into some confusion regarding the asynchronous/synchronous execution of node.
I am using node, sequelize with sqlite and async.js.
I have a series of Articles
, each of which has a number of Authors
.
For each Authors
in each Article
, I'd like to check if the Author
exists. If not, create it.
The problem is, on the initial run, duplicate authors are being created, I assume due to asynchronous functionality causing an issue with checking for existence.
For example, with the array: authors = ['A. Test', 'B. Test', 'C. Test', 'A. Test']
and the code:
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()
})
}
})
})
})
On the first run, will create a table:
ID | name
------------
0 | A. Test
1 | B. Test
2 | C. Test
3 | A. Test
What am I doing wrong? I seem to be missing a fundamental concept of asynchronous vs synchronous execution in Node.
(I've also tried async.eachSeries which is supposed to execute in series rather than in parallel?)
Edit: Slightly refactored, but still creating duplicates
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()
})
}
})
})
findOrCreate
(and refactored to a somewhat cleaner snippet added to my answer above) butfindOrCreate
was causing all sorts of issues with sqlite blocking/database locking - apparently this was happening in postgres for some users as well. Unfortunately, my new snippet still doesn't actually work, and is still creating duplicates. – Historied