我正在尝试检查存储在数据库中的输入的用户名和密码。
我的解决方案不正确,我认为可能有比我的代码更好的东西。

到目前为止,这里:

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,但是用户名和密码正确。我怎样才能解决这个问题?

最佳答案

在成功的callback函数中,您有2个参数,但在错误回调中,只有一个参数。

errorsuccess情况下,第一个参数的值始终为null,在if (!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);
    }
  });
});

10-06 03:01