MongoDB + Express:如何使用db.collection(). findone()或.find()验证登录

MongoDB + Express: How to verify login credentials using db.collection().findOne() or .find()?

本文关键字:findone find 登录 验证 collection Express db 何使用 MongoDB      更新时间:2023-09-26

我有一个POST请求,用户凭据作为登录页面的对象,并像这样传递到API服务器:

  loginUser(creds) {
    //creds is in the form of { username: bob, password: 123 }
    var request = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(creds),
    }
    fetch(`http://localhost:3000/api/login`, request)
    .then(res => res.json())
    .then(user => {
      console.log(user);
      console.log('Successful')
    })
    .catch(err => {
      console.log('Error is', err)
    })
  },

和API服务器接收它这样:

//With .findOne()
    app.post('/api/login/', function(req, res) {
      console.log('Req body in login ', req.body)
      db.collection('users').findOne(req.body, function(err, isMatch) {
        console.log('ISMATCH IS: ' + isMatch)
        if(err) {
          console.log('THIS IS ERROR RESPONSE')
          res.json(err)
        } else {
          console.log('THIS IS ISMATCH RESPONSE')
          res.json(isMatch)
        }
      })
    })

//With .find()
    app.post('/api/login/', function(req, res) {
      console.log('Req body in login ', req.body)
      //console logs correctly as { username: bob, password: 123 }
      db.collection('users').find(req.body).next(function(err, isMatch) {
        console.log('ISMATCH IS: ' + isMatch)
        if(err) {
          console.log('THIS IS ERROR RESPONSE')
          res.json(err)
        } else {
          console.log('THIS IS ISMATCH RESPONSE')
          res.json(isMatch)
        }
      })
    })

因此,通过传入的登录凭据,在API服务器内部,我想搜索我的'users'数据库,看看是否有任何匹配传入的凭据。但在这两种情况下,isMatch始终是null,并且始终记录console.log('THIS IS ISMATCH RESPONSE'),即使用户凭证与数据库中的任何凭证都不匹配。在客户端,我从来没有得到任何错误响应,总是记录console.log('Successful')

似乎不知道我错过了什么。我能做错什么吗?

谢谢

我建议您先找到用户,然后比较密码,例如:

db.collection('users').findOne({ username: req.body.username}, function(err, user) {
        console.log('User found ');
        // In case the user not found   
        if(err) {
          console.log('THIS IS ERROR RESPONSE')
          res.json(err)
        } 
        if (user && user.password === req.body.password){
          console.log('User and password is correct')
          res.json(user);
        } else {
          console.log("Credentials wrong");
          res.json({data: "Login invalid"});
        }              
 });

应该在。findone()方法中使用$和运算符。

工作的例子:

db.collection('users').findOne( 
    { $and: [ 
      { name: req.body.username.toLowerCase() }, 
      { password: req.body.password } 
    ] }, 
   (err, result) => {
    if(err) {
      res.status(500).send(err);
      return;
    }
    if(!result) {
        data = {
            "meta": {
                "status": "fail",
                "message": "Login Failure: Invalid username or password"
            }
        };
        res.status(401).send(data);
    } else {
        data = {
            "meta": {
                "status": "success",
                "message": "Login success"
            }
        };
        res.json(data);
    }
});