Mam następujący kod:Jak obejść problem asynchroniczny w 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.")
}
}
});
}
Kiedy uruchomić skrypt po raz pierwszy, ja skończyć z 4 kont dla Boba. Kiedy uruchomię go po raz drugi, otrzymuję 4 wiadomości, że konto już istnieje.
Jestem pewien, że wiem, dlaczego tak jest, a rozwiązaniem, które wymyśliłem, jest użycie kolejki do przetwarzania każdego odczytu/zapisu bazy danych w kolejności pojedynczej. Chciałbym wiedzieć, czy jest to właściwy sposób, aby to osiągnąć i jaka byłaby najlepsza ogólna praktyka w tym zakresie?
Chcesz, aby wstawki 2, 3 i 4 zakończyły się niepowodzeniem? –
Tak, ponieważ konto powinno już istnieć (ale jeszcze nie jest). – user2037584
Najlepszą praktyką jest dodanie unikalnego indeksu do 'e-maila', a następnie obsłużenie błędu' wstaw', jeśli istnieje duplikat, ponieważ inny smak konta "" już istnieje. "Błąd. – JohnnyHK