Как действовать на объект отклика Express на основе результата асинхронной функции? - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь создать простой компонент приложения 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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...