Javascript 不断获得;TypeError:无法读取属性';publicUsername';“无效”的定义;错误

Javascript 不断获得;TypeError:无法读取属性';publicUsername';“无效”的定义;错误,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,嘿,伙计们,我有一个在提交到数据库之前验证表单的函数,但是其中一个字段需要唯一,所以我必须将数据发送回数据库进行比较,如果有错误,它将指示用户,否则它将把数据保存到数据库中。但我不断得到“TypeError:无法读取null的属性'publicUsername',我不知道为什么 我的代码 验证设计 checkPublicUsername 当你打电话时: users.findOne( { "publicUsername" : data } ) 如果它返回任何表示他们试图使用的public

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

我的代码 验证设计 checkPublicUsername 当你打电话时:

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

执行完全相同操作的另一种方法是为
{“publicUsername”:data}
调用
count()
函数,并将1解释为“it's take”,将0解释为“it's available”


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

错误应该为您提供准确的文件和行号。你还需要什么?是的,我知道,但我不明白为什么我一直都要知道,函数user.findOne是什么?因为传入回调的结果为空。@如果数据匹配,则此函数的第三个作用是将现有数据与publicUsername进行比较(这意味着它不能使用,因为它必须是唯一的)您使用的是findOne,因此,如果没有包含该查询的文档,则在您尝试检查result.publicUserName之后,它将返回null。由于result为null,您无法获取它的is属性。您应该检查结果是否为空。
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
             }
        })

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