Одиночный пн go поиск документов с express - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в MongoDB, express. Я хочу подтвердить пользователя с его именем пользователя и паролем. Но мой код не выдает никаких ошибок и выполняет «оператор else», даже если я использую правильные учетные данные.

Вот файл JS:

    app.post('/auth', function(req, res){

    var user = ( db.collection('auth').findOne({name: req.body.username}));
    var pass = ( db.collection('auth').findOne({password: req.body.password}));

    if(user == req.body.username && pass == req.body.password){
        res.send("Credentials Match");
    }else{
        res.send("Wrong Credentials");
    }
    console.log(req.body);
})

Вот файл HTML:

 <form class="form-signin" action="/auth" method="POST">
        <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
        <label for="inputEmail" class="sr-only">Username</label>
        <input type="text" placeholder="Username" name="username" required="">
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" name="password" placeholder="password" required="">
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
 </form>

Ответы [ 2 ]

1 голос
/ 06 мая 2020

эти две строки

var user = ( db.collection('auth').findOne({name: req.body.username}));
var pass = ( db.collection('auth').findOne({password: req.body.password}));

представляют асинхронный код, поэтому проверки if else не будут ждать их выполнения

, если только вы не заказали javascript подождать

вы можете использовать async/await, чтобы заставить код ждать, пока асинхронная часть не будет выполнена

также, вы получаете только имя пользователя, а затем получаете только пароль

поэтому, если пользователь вводит свое имя, но другой пароль, а не его правильный, и этот пароль существует в базе данных, вход в систему будет выполнен, хотя это не должно быть

, вы должны проверить имя пользователя и пароль из того же документа, чтобы избежать этого

что-то вроде этого

app.post('/auth', async function(req, res) { // note the async keyword here
    try {
        var user = await db.collection('auth').findOne({ name: req.body.username , password: req.body.password });

        if (user && user.name == req.body.username && user.password == req.body.password) {
            res.send("Credentials Match");
        } else {
            res.send("Wrong Credentials");
        }
        console.log(req.body);
    }
    catch (err) {
        console.log('Exception >>\n', err); // log the error
        res.send("Something wrong has happened while checking the credentials");
    }
})

надеюсь, что это поможет

0 голосов
/ 06 мая 2020

Метод findOne возвращает вам документ. Таким образом, сравнение со строкой, возможно, всегда будет неудачным. Что вам нужно сделать, это сначала получить документ.

var user = db.collection('auth').findOne({name: req.body.username, password: req.body.password});

Это вернет вам пользователя, у которого есть комбинация имени и пароля, которую вы ищете. Теперь вы просто спрашиваете, использует ли пользователь null или документ, и на этом вы можете основать свой if / else.

Я бы предложил зарегистрировать вашего текущего пользователя var и пароль var в консоли (через метод console.log () , чтобы вы могли видеть, какую ошибку вы делали.

Затем распечатайте предоставленную мной строку и посмотрите, в чем разница. Попробуйте сделать это с «неправильным» паролем и посмотрите, какой тип возвращаемого значения вы попадаете туда. Таким образом вы можете адаптировать свои условия if / else.

...