不幸的是,我对节点不熟悉,并且对节点的异步/同步执行产生了一些困惑。
我正在使用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
答案 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();
})
}
})
})
})