【发布时间】:2013-02-09 17:26:11
【问题描述】:
我有以下代码:
// 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.")
}
}
});
}
当我第一次运行脚本时,我最终得到了 bob 的 4 个帐户。当我第二次运行它时,我收到 4 条帐户已经存在的消息。
我很确定我知道为什么会这样,我想出的解决方案是使用某种队列来处理数据库的每次读/写。我想知道的是,这是否是正确的做法,一般的最佳做法是什么?
【问题讨论】:
-
所以你想让第二、第三和第四次插入失败?
-
是的,因为该帐户应该已经存在(但还不存在)。
-
最佳实践是在
email上添加一个唯一索引,然后处理insert错误,如果存在另一种形式的"Account already exists."错误。 -
这听起来是个不错的处理方式。
-
你也可以尝试用 Promise 解决问题,参见:stackoverflow.com/questions/11912573/…
标签: javascript node.js mongodb asynchronous