继续得到“TypeError:无法读取属性'publicUsername'的null”错误

时间:2013-11-30 10:01:42

标签: javascript node.js mongodb express

嘿伙计们我有一个函数在提交到数据库之前验证表单,但是其中一个字段需要是唯一的,所以我必须将数据发送回数据库进行比较,如果有错误则表明用户否则它会将数据保存到数据库中。但我一直得到“TypeError:无法读取属性'publicUsername'的null”,我不知道为什么

我的代码

  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);
                });
            });   
    }
}

validateSignup

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);
             }
        });

checkPublicUsername

  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
             }
        })

    }

1 个答案:

答案 0 :(得分:1)

致电时:

    users.findOne( { "publicUsername" : data } )

如果它返回任何意味着他们尝试使用的publicUsername已经存在。如果findOne返回null,则表示它尚不存在。您不应该对返回的文档进行进一步检查 - 返回它的事实意味着它与您的查询匹配,并且publicUsername保证等于数据。当它不存在时返回null,这就是你需要知道的全部内容。

完成同样事情的另一种方法是为count()调用{ "publicUsername" : data }函数并将1解释为“它被采用”而将0解释为“它可用”

请注意,这还不够检查 - 在您检查数据库的时间和将用户的新注册发送到后端的时间之间,其他人可能已经使用了该用户名,因此您必须拥有{{3}为了防止重复插入,你应该捕获重复的错误并在你的应用程序中处理它。