首页 > 解决方案 > 如何解决错误的请求

问题描述

我正在尝试在后端使用 b crypt 来比较加密的密码,但我不断收到无效密码,即使这样仍然让我在这里是我的后端代码...

router.post('/login', function (req, res) {
const {
userName = req.body.userName,
password = req.body.password,
} = req.query;

connection.query(
SELECT_USER_QUERY + ' WHERE username = ? ',
[userName],
function (error, results, fields) {
  if (error) throw error;
  else {
    if (results.length > 0) {
      bcrypt.compare(password, results[0].password, function (err, result) {
        if (result) {
          return res.send({ message: 'Login Successful' });
        } else {
          return res.status(400).send({ message: 'Invalid Password' });
        }
      });
    } else {
      return res.status(400).send({ message: 'Invalid userName' });
    }
  }
}
);
});

我的查询看起来像这样......

const SELECT_USER_QUERY = 'SELECT id, firstName, lastName, userName,' +
' password, email FROM users';

这就是我所说的......

handleLogIn = () => {
const { userName } = this.state.user;
const { users } = this.state;

postFetch(`/users/login`, {
  id: users.find((user) => user.userName === userName).id,
  firstName: users.find((user) => user.userName === userName)
    .firstName,
  lastName: users.find((user) => user.userName === userName).lastName,
  userName: users.find((user) => user.userName === userName).userName,
  password: users.find((user) => user.userName === userName).password,
  email: users.find((user) => user.userName === userName).email
})
  .then(
    this.setState({
      user: {
        ...this.state.user,
        id: users.find((user) => user.userName === userName).id,
        firstName: users.find((user) => user.userName === userName)
          .firstName,
        lastName: users.find((user) => user.userName === userName).lastName,
        userName: users.find((user) => user.userName === userName).userName,
        password: users.find((user) => user.userName === userName).password,
        email: users.find((user) => user.userName === userName).email,
      },
    }),
    this.getPreference(users.find((user) => user.userName === userName).id),
    this.getReadings(users.find((user) => user.userName === userName).id)
  )
  .catch((err) => console.log(err));
};

我使用 b crypt 在我的添加路线中散列一个加盐密码我试图添加它但它不会让我请任何帮助将不胜感激

标签: javascriptreactjs

解决方案


我相信问题在于你在哪里解构你的userNamepassword变量。你目前有这个:

const {
userName = req.body.userName,
password = req.body.password,
} = req.query;

这是一个有点混合的比喻。您应该像这样单独分配变量:

const userName = req.body.userName;
const password = req.body.password;

或者像这样解构它们:

const {
    userName,
    password
} = req.query;

您没有指定您正在使用什么类型的后端,但从router.post第一行开始,我假设您正在接收一个帖子。在这种情况下,我希望用户名和密码位于req.post. 但是,当我在 jsfiddle 中尝试您的原始代码时,我从req.query.

您提到您在浏览器控制台中看到 400,我看到您的服务器代码在用户名或密码无效时返回 400 响应。所以我认为问题在于您的服务器代码没有正确解构请求,userNameandpassword变量为空,因此验证失败。

所以正确的代码是:

const userName = req.body.userName;
const password = req.body.password;

或者:

const {
    userName,
    password
} = req.body;

推荐阅读