【问题标题】:Unhandled rejection TypeError: Cannot read property 'username' of null未处理的拒绝类型错误:无法读取 null 的属性“用户名”
【发布时间】:2017-08-08 04:30:39
【问题描述】:

我正在使用 NodeJS、PassportJS、MySQL 和 Sequalize(MySQL 的 ORM)。此代码来自我的 Passport.JS 文件。当用户在我的网站上注册时,如果用户名或电子邮件被占用,我将返回错误。如果在数据库中找不到两个用户名、电子邮件,则将创建一个新的创建帐户。

我在网站上注册时遇到的错误是...

Unhandled rejection TypeError: Cannot read property 'username' of null
    at null.<anonymous> (/home/ubuntu/workspace/Authentication.1/config/passport/passport.js:50:16)
    at tryCatcher (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:693:18)
    at Async._drainQueue (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/async.js:17:14)

我的代码是:

        User.findOne({
            // SELECT * FROM users WHERE username = username || email = ... 
            where: {
                $or: [{username: username}, {email: req.body.email}]
            }
        }).then(function(user){

        // GETTING ERROR HERE. If username is already in database
        if(user.username !== null && user.username == req.body.username) {
          return done(null, false, console.log("USER TAKEN"),{message : 'That username is already taken'} );
        }

        // If email is already in database return err.
        else if(user.email !== null && user.email == req.body.email) {
          return done(null, false, console.log("EMAIL TAKEN"),{message : 'That email is already taken'} );
        }

        else [code for create new account]...

【问题讨论】:

  • user 为空,而不是用户名。
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。

标签: javascript mysql node.js sequelize.js


【解决方案1】:

您的问题来自您的if 语句中的第一次检查。如果未找到用户,user 将为 null,并且语句 user.username !== null 将导致您收到错误消息。

您应该对整个对象而不是属性执行空检查。 if(user!== null &amp;&amp; user.username == req.body.username){...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多