簡體   English   中英

如果語句運行但不滿足條件

[英]If statement runs but condition is not met

我正在使用 NodeJS、PassportJS、MySQL 和 Sequalize(ORM for MySQL)。 此代碼來自我的 Passport.JS 文件。 當用戶在我的網站上注冊並使用用戶名或電子郵件時,我將返回一個錯誤。 如果在數據庫中找不到用戶名和電子郵件,將創建一個新的創建帳戶。

但是創建新帳戶的 else 語句永遠不會運行。 當我使用未使用的電子郵件和用戶名創建新帳戶時會發生此錯誤。

未處理的拒絕類型錯誤:無法讀取 null 處未定義的屬性“用戶名”。 (/home/ubuntu/workspace/Authentication.1/config/passport/passport.js:59:21) 在 tryCatcher (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/ util.js:16:23) 在 Promise._settlePromiseFromHandler (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:512:31) 在 Promise._settlePromise (/ home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:569:18) 在 Promise._settlePromise0 (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/ node_modules/bluebird/js/release/promise.js:614:10) 在 Promise._settlePromises (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:693: 18) 在 Async._drainQueue (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/release/async.js:133:16) 在 Async._drainQueues (/home/ubuntu/workspace/ Authentication.1/node_modules/sequel ize/node_modules/bluebird/js/release/async.js:143:10) 在 Immediate.Async.drainQueues [as _onImmediate] (/home/ubuntu/workspace/Authentication.1/node_modules/sequelize/node_modules/bluebird/js/ release/async.js:17:14) 在 processImmediate [as _immediateCallback] (timers.js:396:17)

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

// console.log('====================');
// console.log(user);
// console.log(user[0].username);  
// console.log(req.body.username);
// console.log(user[0].email);
// console.log(req.body.email);
// console.log('====================');

// If a user is returned from the database run this if statement
if(user != null) {
  // GETTING ERROR HERE. If username is already in database return err
  if(user[0].username == req.body.username) { **//THIS LINE CAUSE ERROR **
    console.log(user[0].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[0].email == req.body.email) {
    return done(null, false, console.log("EMAIL TAKEN"),{message : 'That email is already taken'} );
  }  

}


else CREATE NEW ACCOUNT... // this never runs for some reason

> 整個 PASSPORT.JS 文件

passport.use('local-signup', new LocalStrategy(


  {           
    usernameField : 'username',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
  },


  function(req, username, password, done){
    var generateHash = function(password) {
      return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
    };

    User.findAll({
        where: {
          $or: [{username: username}, {email: req.body.email}]
        }
    }).then(function(user){

    // console.log('====================');
    // console.log(user);
    // console.log(user[0].username);  
    // console.log(req.body.username);
    // console.log(user[0].email);
    // console.log(req.body.email);
    // console.log('====================');


    if(user != null) {
      if(user[0].username == req.body.username) {
        console.log(user[0].username);  
        return done(null, false, console.log("USER TAKEN"),{message : 'That username is already taken'} );
      }


      else if(user[0].email == req.body.email) {
        return done(null, false, console.log("EMAIL TAKEN"),{message : 'That email is already taken'} );
      }  

    }


    else
    {
      var userPassword = generateHash(password);
      var data =
      { 
        username: username,
        password: userPassword,
        email: req.body.email
      };

如果您使用 user[0],則 user 是一個數組

條件是:

if(user != null && user.length > 0) {

看起來您正在檢查 user[0].username 或 req.body.username 在它不存在的情況下。 如果是這種情況,您可以在 if 語句中添加額外的檢查,以確保在更高層密鑰不存在的情況下不檢查用戶名,例如:

if (user[0] && req.body && (user[0].username == req.body.username)) {
      // your code here 
   } 

我會檢查錯誤所引用的行,以確定是用戶還是主體具有未定義的用戶名。 否則,正如 adeneo 所提到的,您可能沒有運行 body-parser。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM