2017-05-14 33 views
0

我使用nodejs与sequ​​elize设置我的数据库,目前我正在尝试哈希和盐我的密码,哈希我已经做了,但现在当我tyr登录我想比较密码在发送与req.body散列之一,所以我这样做:得到有效的密码与bcrypt

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; 
} 

我没有得到来自

012的任何响应

我试图console.log,但stilm没有反应,当我尝试去路由器/登录它只是没有给我任何响应它加载所有的时间,任何消化?

回答

1

首先,您的路线定义了一个后续操作/而不是/login。如果你还没有前端,你可以使用邮递员尝试一下。

的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 
    }); 
}); 

另外,在你赶上方法,状态码应该是描绘内部服务器错误,如500200是不适合的。

+0

仍无法正常工作,在路由/是因为我用app.use登录 –

+0

我没有得到任何邮递员结果 –

+0

是在控制台上登录的“hi” –

-2

Soo似乎可以在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,可以治疗实例:)

+0

谢谢您的回答。请注意,“I”在英语中总是大写。 – peterh

+0

在V4中的续集类方法和实例方法已被弃用,以支持User.prototype.validPassword = function(){}和User.associate = function(){} ---请参阅文档:http://docs.sequelizejs。 COM /手动/教程/升级到v4.html#磨合变化 –