我有以下代碼:如何解決這個MongoDB/Node異步問題?
// Retrieve
var MongoClient = require("mongodb").MongoClient;
var accounts = null;
var characters = null;
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/bq", function(err, db) {
if(err) { return console.dir(err); }
db.createCollection('accounts', function(err, collection) {
if(err) { return console.dir(err); }
else { accounts = collection; }
createAccount("bob","bob");
createAccount("bob","bob");
createAccount("bob","bob");
createAccount("bob","bob");
});
});
function createAccount(email, password)
{
accounts.findOne({"email":email}, function(err, item) {
if(err) { console.dir(err); }
else {
if(item === null) {
accounts.insert({"email":email, "password":password}, function(err, result) {
if(err) { console.dir(err); }
else { console.dir("Account " + email + " created."); }
});
}
else {
console.dir("Account already exists.")
}
}
});
}
當我運行該腳本的第一次,我結束了4個佔鮑勃。當我第二次運行它時,我收到4條消息,說明該帳戶已經存在。
我很確定我知道這是爲什麼,我提出的解決方案是使用某種類型的隊列按順序處理每個數據庫的讀/寫操作。我想知道的是,這是否是正確的方式去做,以及對此的一般最佳實踐是什麼?
所以你想要第二,第三和第四次插入失敗? –
是的,因爲該帳戶應該已經存在(但不僅僅是)。 – user2037584
最好的做法是在'email'上添加一個唯一的索引,然後處理'insert'錯誤,如果有一個重複的''帳戶的另一個味道已經存在。「錯誤。 – JohnnyHK