2016-08-01 75 views
0

我想檢查存儲在數據庫中輸入用戶名和密碼。 我的解決方案不正確,我認爲可能比我的代碼更好。檢查的NodeJS用戶名和密碼返回NULL

這是迄今:

function login (username, password, callback) { 
    var query = "SELECT * FROM users WHERE username = ?"; 

    connection.query(query, [username], function (err, results) { 
     if (err) return callback(err); 
     if (results.length === 0) return callback(); 
     var user = results[0]; 

     if (!bcrypt.compareSync(password, user.password)) { 
      return callback(); 
     } 

     callback(null, { 
      id:   user.id.toString(), 
     }); 

    }); 
} 
app.get('/salam', function (req, res) { 
    var username = 'mahdi'; 
    var originalPassword = 'a'; 

    login(username , originalPassword,function (callback) { 
     console.log(callback); 
    }); 
}); 

在我的代碼,console.log(callback);返回null,但用戶名和密碼是否正確。我怎樣才能解決這個問題?

+0

您已經設定回調的第一個參數爲NULL? '回調(** **空,{ID:user.id.toString()});' –

回答

2

在你的成功callback功能,你有2個參數,但在錯誤回調,只有一個參數。

errorsuccess情況下,第一個參數的值將總是nullif (!bcrypt.compareSync(password, user.password)) {情況下,第一個參數的值將是undefined因爲沒有作爲參數被傳遞值。

建議:使用第一個參數爲Booleanfalsetrue),並基於該值,處理回調。

function login(username, password, callback) { 
 
    var query = "SELECT * FROM users WHERE username = ?"; 
 

 
    connection.query(query, [username], function(err, results) { 
 
    if (err) return callback(false); 
 
    if (results.length === 0) return callback(); 
 
    var user = results[0]; 
 

 
    if (!bcrypt.compareSync(password, user.password)) { 
 
     return callback(false); 
 
    } 
 
    callback(true, { 
 
     id: user.id.toString(), 
 
    }); 
 

 
    }); 
 
} 
 
app.get('/salam', function(req, res) { 
 
    var username = 'mahdi'; 
 
    var originalPassword = 'a'; 
 

 
    login(username, originalPassword, function(success, value) { 
 
    if (success) { 
 
     console.log(value); 
 
    } 
 
    }); 
 
});

+0

它不會永遠是'null':有在OP的代碼兩個地方(在你的一處)函數在沒有參數的情況下調用,所以'callback'將會是'undefined'。 – nnnnnn

+0

@nnnnnn更新..錯過了一部分;) – Rayon

+0

@Rayon謝謝,問題解決了:)先生等待我接受 –

1

它應該是的,因爲你沒有通過回調東西。改變這樣的:

function login (username, password, callback) { 
    var query = "SELECT * FROM users WHERE username = ?"; 

    connection.query(query, [username], function (err, results) { 
     if (err) return callback(err); 
     if (results.length === 0) return callback(null, false); 
     var user = results[0]; 

     if (!bcrypt.compareSync(password, user.password)) { 
      return callback(null, false); 
     } 

     callback(null, true, { 
      id:   user.id.toString(), 
     }); 

    }); 
} 
app.get('/check', function (req, res) { 
    var username = 'mahdi'; 
    var originalPassword = 'a'; 

    login(username , originalPassword,function (err, result, id) { 
     console.log(err); 
     console.log(result); 
     console.log(id); 
    }); 
}); 

result是找出行動true|false。而id指當result是真的

而且errcallback需要錯誤處理

+0

如果你沒有通過任何東西(這是在兩個地方的情況下)的參數將是'undefined',不'null'。但在我認爲這是OP的代碼顯式傳遞'null'的成功案例。 – nnnnnn

+0

@Ebrahim Pasbani +1謝謝Ebrahim agha –