Я пытаюсь создать простой компонент приложения Express, который принимает учетные данные для входа в систему через параметры URI запроса GET и обслуживает целевую страницу пользователя или страницу с ошибкой в зависимости от того, соответствуют ли предоставленные учетные данные учетным данным MySQL.
Насколько я понимаю, мне нужно предоставить функцию рендеринга для credentialsAreValid () в качестве обратного вызова, обеспечить сравнение хеш-функций в качестве обратного вызова из запроса MySQL ... к сожалению, я борюсь с внутренностями credentialsAreValid (),В его нынешнем виде я получаю «TypeError: Невозможно прочитать свойство 'res' из неопределенного», что, я думаю, объясняется тем, что credentialsAreValid () разрешается до того, как readOnlyConnection.query () вызывает обратный вызов?
Поскольку readOnlyConnection.query ()это функция MySQL, я понятия не имею, как передать в него параметр res из credentialsAreValid ().Я нахожусь около двух недель в JS / Express, так что, возможно, я неправильно подхожу ко всей задаче.
Бонусные баллы, если кто-нибудь может сказать мне, почему совпадение возвращает false, несмотря на то, что он приведен к String и выглядит какидентичны.(Хэш MySQL имеет тип BLOB, но, похоже, он преобразуется нормально, и он не работает даже при использовании оператора ==)
Соответствующий код:
router.get('/login/:username/:hash', function(req, res, next) {
console.log(`attempted login with username=${req.params.username} and hash=${req.params.hash}`);
login.credentialsAreValid(req.params.username, req.params.hash, res, function(res, valid) {
if (valid) {
console.log("Login Successful").
res.render('login', { title: 'success' });
}
else {
console.log("Login Unsuccessful").
res.render('login', { title: 'fail' });
}
})
});
credentialsAreValid = function (username, password, res, callback) {
console.log(`Checking password for user "${username}"`);
var clientHash = String(createHash(password));
console.log(`Hashed ${password} to ${clientHash}`);
var hashesMatch = readOnlyConnection.query(`SELECT passwordHash FROM users WHERE users.username = "${username}";`, function(err, rows, fields) {
var serverHash = (rows.length > 0) ? String(rows[0].passwordHash) : "";
console.log(`Comparing clientHash ${clientHash} with serverHash ${serverHash} (${clientHash == serverHash})`);
return callback(res, clientHash === serverHash);
console.log(`This should never display`);
});
};
Вывод на консоль сервера:
attempted login with username=groucho and hash=password
Checking password for user "groucho"
Hashed password to password
Comparing clientHash password with serverHash password (false)
Login Unsuccessful
/home/node/alex-practice/node_modules/mysql/lib/protocol/Parser.js:80
throw err; // Rethrow non-MySQL errors
^
TypeError: Cannot read property 'res' of undefined
at /home/node/alex-practice/routes/index.js:43:46
at Query.<anonymous> (/home/node/alex-practice/login-helper.js:33:16)
at Query.<anonymous> (/home/node/alex-practice/node_modules/mysql/lib/Connection.js:502:10)
at Query._callback (/home/node/alex-practice/node_modules/mysql/lib/Connection.js:468:16)
at Query.Sequence.end (/home/node/alex-practice/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
at Query._handleFinalResultPacket (/home/node/alex-practice/node_modules/mysql/lib/protocol/sequences/Query.js:139:8)
at Query.EofPacket (/home/node/alex-practice/node_modules/mysql/lib/protocol/sequences/Query.js:123:8)
at Protocol._parsePacket (/home/node/alex-practice/node_modules/mysql/lib/protocol/Protocol.js:278:23)
at Parser.write (/home/node/alex-practice/node_modules/mysql/lib/protocol/Parser.js:76:12)
at Protocol.write (/home/node/alex-practice/node_modules/mysql/lib/protocol/Protocol.js:38:16)
[nodemon] app crashed - waiting for file changes before starting...