2016-08-01 4 views
0

Я пытаюсь проверить введенное имя пользователя и пароль, хранящиеся в базе данных. Мое решение неверно, и я думаю, что может быть что-то лучше моего кода.NodeJs проверить имя пользователя и пароль return

Здесь до сих пор:

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); возвращает нулевое значение, но имена пользователей и пароли правильны. Как я могу это исправить?

+0

Вы уже садились первым параметром обратного вызова в качестве NULL? 'callback (** null **, {id: user.id.toString(),});' –

ответ

2

В вашем успехе функция callback, у вас есть 2 аргумента, но в обратном вызове с ошибкой - только один аргумент.

В error и success случае, значение первого параметра всегда будет null и в if (!bcrypt.compareSync(password, user.password)) { случае, значение первого аргумента будет undefined как не существует никакого значения передаются в качестве аргумента.

Предложение: Используйте первый аргумент, как Boolean (false или true) и на основании значения, обработки обратного вызова.

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 верно

Также err для callback необходим для обработки ошибок

+0

Если вы ничего не пропускаете (что имеет место в двух местах), аргумент будет 'undefined', а не' null'. Но в том, что я предполагаю, что это случай успеха, код OP явно передает «null». – nnnnnn

+0

@ Ebrahim Pasbani +1 Спасибо Ebrahim agha –

Смежные вопросы