this.handleSignup = function(req, res, next) {
"use strict";
var validate = validateSignup(req.body, function(error, data) {
if(error) {
res.send(400, error.message);
}
});
if(validate){
users.addUser(data, function(err, user) {
sessions.startSession(data, function(err, session_id) {
"use strict";
if (err) return next(err);
res.cookie('session', session_id);
res.send(200);
});
});
}
}
function validateSignup(data,callback) {
"use strict";
users.checkPublicUsername(data.publicUsername, function(err, result){
if(result){
callback(new Error('Public Username is taken Please choose another'), null);
}
});
this.checkPublicUsername = function(data,callback) {
var publicUsername = {
"publicUsername":data
}
users.findOne(publicUsername, function(err, result) {
if(result.publicUsername === data){//terminal show this line is the error
callback(null,true); // if match return true to trigger indicator
}else{
callback(null,false); // else return false to proceed
}
})
}
答案 0 :(得分:1)
致电时:
users.findOne( { "publicUsername" : data } )
如果它返回任何意味着他们尝试使用的publicUsername已经存在。如果findOne返回null,则表示它尚不存在。您不应该对返回的文档进行进一步检查 - 返回它的事实意味着它与您的查询匹配,并且publicUsername保证等于数据。当它不存在时返回null,这就是你需要知道的全部内容。
完成同样事情的另一种方法是为count()
调用{ "publicUsername" : data }
函数并将1解释为“它被采用”而将0解释为“它可用”
请注意,这还不够检查 - 在您检查数据库的时间和将用户的新注册发送到后端的时间之间,其他人可能已经使用了该用户名,因此您必须拥有{{3}为了防止重复插入,你应该捕获重复的错误并在你的应用程序中处理它。