Javascript 使用bcrypt获取有效密码

Javascript 使用bcrypt获取有效密码,javascript,node.js,postgresql,express,sequelize.js,Javascript,Node.js,Postgresql,Express,Sequelize.js,我正在使用nodejs和sequelize来设置我的数据库,目前我正在尝试对我的密码进行哈希和盐渍处理,我已经进行了哈希处理,但是现在当我要登录时,我想将密码send in req.body与哈希处理后的密码进行比较,所以我这样做了: router.post('/', function (req, res, next) { console.log("hi"); if (JSON.stringify(req.body) == "{}") { return res.status(40

我正在使用nodejs和sequelize来设置我的数据库,目前我正在尝试对我的密码进行哈希和盐渍处理,我已经进行了哈希处理,但是现在当我要登录时,我想将密码send in req.body与哈希处理后的密码进行比较,所以我这样做了:

router.post('/', function (req, res, next) {
  console.log("hi");
  if (JSON.stringify(req.body) == "{}") {
    return res.status(400).json({ Error: "Login request body is empty" });
  }
  if (!req.body.username || !req.body.password) {
    return res.status(400).json({ Error: "Missing fields for login" });
  }

    var password = User.validPassword(req.body.password);


  // search a user to login
  User.findOne({ where: { username: req.body.username, password: password } }) // searching a user with the same username and password sended in req.body
    .then(function (user) {
      if (!user) {
        return res.status(400).json({ Error: "There is no user with those fields" }); // if there is no user with specific fields send
      }
        return res.status(400).json({ Error: "loged in!" }); // username and password match
    }).catch(function (err) {
      return res.status(200).json({ message: "server issues when trying to login!" }); // server problems
    });
});
我的模型是这样的:

"use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');

module.exports = function (sequelize, DataTypes) {
  var User = sequelize.define("User", {
    username: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING
  }, {
      classMethods: {
        generateHash: function (password) {
          console.log("hi");
          return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },
        validPassword: function (password) {
          return bcrypt.compareSync(password, this.password);
        }
      }

    });



  return User;
}
我没有得到任何回应

var password = User.validPassword(req.body.password);

我尝试了console.log,但仍然没有响应,当我尝试转到路由器/登录时,它没有给我任何它一直在加载的响应,任何建议?

首先,您的路由定义了一个到
/
而不是
/login
的post操作。如果你还没有前端,你可以用邮递员来试试

validPassword方法应该在用户模型的实例上调用,因此您应该像这样编写这部分代码

router.post('/', function (req, res, next) {
  console.log("hi");
  if (JSON.stringify(req.body) == "{}") {
    return res.status(400).json({ Error: "Login request body is empty" });
  }
  if (!req.body.username || !req.body.password) {
    return res.status(400).json({ Error: "Missing fields for login" });
  }

  // search a user to login
  User.findOne({ where: { username: req.body.username } }) // searching a user with the same username and password sended in req.body
    .then(function (user) {
      if(user && user.validPassword(req.body.password)) {
         return res.status(200).json({message: "login successful"});
      } else {
         return res.status(401).json({message: "Unauthorized"});
      }

    }).catch(function (err) {
      return res.status(200).json({ message: "server issues when trying to login!" }); // server problems
    });
});

同样在catch方法中,状态代码应该是描述内部服务器错误的代码,如
500
200不合适。

在Femi Oladeji的帮助下,我似乎可以回答我自己的问题,基本上这个问题与我想通过实例而不是模型来访问方法有关

因此,当我尝试使用用户实例访问它时,没有处理实例的方法,所以对我的模型做了一些更改

"use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');

module.exports = function (sequelize, DataTypes) {
  var User = sequelize.define("User", {
    username: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING
  }, {
      classMethods: {
        generateHash: function (password) {
          return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },

      },
      instanceMethods: {
        validPassword: function (password) {
          console.log(password, this.password)
          return bcrypt.compareSync(password, this.password);
        }
      }


    });



  return User;
}

还有instanceMethods,它可以处理实例:)

仍然不工作,/in路由是因为我使用了app.use登录控制台上的“hi”我总是收到服务器错误,我传递用户名和密码我认为用户validatepassword工作不正常:/你能做一个
console.log吗(password,this.password)
方法内部感谢您的回答。注意,“I”在英语中始终是大写。在sequelize的V4中,类方法和实例方法被弃用,取而代之的是User.prototype.validPassword=function(){}和User.associate=function(){}--请参阅此处的文档: