NodeJs检查用户名和密码返回null

时间:2016-08-01 12:11:32

标签: javascript node.js

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

到目前为止:

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,但用户名和密码是正确的。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

errorsuccess情况下,第一个参数的值始终为null,在if (!bcrypt.compareSync(password, user.password)) {情况下,第一个参数的值将为undefined as没有值作为参数传递。

建议:将第一个参数用作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);
    }
  });
});

答案 1 :(得分: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