有這樣一個(gè)需求,用戶(hù)注冊(cè)的時(shí)候,判斷用戶(hù)名和郵箱是否已經(jīng)被占用。

用戶(hù)注冊(cè)
傳統(tǒng)的實(shí)現(xiàn)思路
- 根據(jù)用戶(hù)名查找記錄,如果存在記錄,證明用戶(hù)名已被占用
- 根據(jù)郵箱查找記錄,如果存在記錄,證明又想已被占用
但是在nodejs中,大家都知道,各種的回調(diào)。簡(jiǎn)單的查詢(xún)數(shù)據(jù)庫(kù)都是異步的。你可能會(huì)這么寫(xiě):
User.findOne({username: user.username}, function (err, doc) {
if(!doc){ // 用戶(hù)不存在,繼續(xù)根據(jù)郵箱進(jìn)行查詢(xún)
User.findOne({username: user.username}, function (err, doc) {
if(doc){ // 郵箱存在返回錯(cuò)誤
req.flash('error', '郵箱已被占用!');
res.redirect('/register');
}else{
//…… 進(jìn)行注冊(cè)操作
}
});
}else{ // 用戶(hù)存在,返回錯(cuò)誤
req.flash('error', '用戶(hù)名已被占用')
res.redirect('/register');
}
});
已經(jīng)嵌套了兩層回調(diào),如果是檢查三個(gè)字段、四個(gè)字段、五個(gè)字段呢?后果不堪設(shè)想!
有沒(méi)有優(yōu)雅的實(shí)現(xiàn)方法呢?答案是有的!我們用到了async。
優(yōu)雅的實(shí)現(xiàn)方式
async是一個(gè)流程控制工具包,可以完美解決我們的問(wèn)題。(關(guān)于async的詳細(xì)介紹,請(qǐng)移步項(xiàng)目地址:https://github.com/caolan/async; 也可以參考這里:http://blog.csdn.net/jbboy/article/details/37667809 ,這里就不作悖述 )
很顯然,根據(jù)我們的需求,兩次的數(shù)據(jù)庫(kù)查詢(xún)判斷并沒(méi)有對(duì)順序做要求,所以我們選擇async的parallel:并行執(zhí)行多個(gè)函數(shù),然后做統(tǒng)一的判斷處理。
async.parallel() 方法接收兩個(gè)參數(shù),一個(gè)是執(zhí)行的方法組,一個(gè)是回調(diào)。
async.parallel([
function(callback){
dosomething(function(){
callback(null, result1);
});
},
function(callback){
dosomething(function(){
callback(null, result2);
});
}
], function(err, results){
console.log(results); // results 值為:{result1, result2}
})
其中第一個(gè)參數(shù),可以是上面那種數(shù)組的形式,也可以是對(duì)象的形式:
{
one: function(callback){
},
two: function(callback){
}
}
實(shí)現(xiàn)方法:
async.parallel({
username: function (callback) {
User.findOne({username: user.username}, function (err, doc) {
callback(null, doc);
});
},
email: function (callback) {
User.findOne({email: user.email}, function (err, doc) {
callback(null, doc);
});
}
}, function (err, results) {
if(results.username) {
req.flash(config.constant.flash.error, '用戶(hù)名已被占用');
res.redirect('/join');
return;
}
if(results.email){
req.flash(config.constant.flash.error, '郵箱已被占用');
res.redirect('/join');
return;
}
});
這樣是不是簡(jiǎn)潔多了?