【问题标题】:keep getting "TypeError: Cannot read property 'publicUsername' of null" error不断收到“TypeError:无法读取属性 'publicUsername' of null”错误
【发布时间】:2013-12-01 00:41:13
【问题描述】:

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

我的代码

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

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

    }

【问题讨论】:

  • 该错误应该为您提供确切的文件和行号。你还需要什么?
  • 是的,我知道,但我不明白为什么我一直在接受它
  • 什么是函数user.findOne?因为传递给回调的结果是空的。
  • @TheThirdOne 这个功能是比较已有数据和publicUsername,如果数据匹配(这意味着它不能被使用,因为它必须是唯一的)
  • 您正在使用 findOne,因此如果没有包含该查询的文档,它将在您尝试检查 result.publicUserName 之后返回 null。由于结果为 null,您无法获取它是属性。您应该检查结果是否为空。

标签: javascript node.js mongodb express


【解决方案1】:

当你打电话时:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 2020-11-02
    • 2020-02-05
    • 2019-04-27
    • 2018-12-29
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多