持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
用户登录大致思路:
1. 验证接口权限
2.获取请求数据 Email password
3. 验证数据: email password输入的字段是否正确
4. 验证业务逻辑 : 用户是否存在+密码是否匹配
5. 返回数据: 生成token 并返回数据
router.post('/login',loginUser)
当为/login时,启用控制器loginUser,查看res的json数据是否响应成功。
1. 获取请求数据
let {email,password} = req.body.user;
2.验证数据字段是否合规
const validateLoginUser = (email,password)=>{
let error ={}
if(validator.isEmpty(password)){
error.password="password不能为空"
}
if(validator.isEmpty(email)){
error.email="email不能为空"
}
if(!validator.isEmpty(email)&&!validator.isEmail(email)){
error.email="email格式不对"
}
let validate = Object.keys(error).length<1//true验证通过
return {error,validate}
}
通过validate的布尔类型来判断数据类型是否存在error,存在任意一个都会回显到捕获错误中间件中。
let {error,validate} = validateLoginUser(email,password)
if(!validate){ //任意一个错误都会throw
throw new HttpException(401,"用户数据校验失败",error)
}
3.验证业务数据
先拿到整条数据:
const user = await User.findByPk(email) //拿到整条数据
这里,如果user存在说明数据库中有账号为email的数据
如果user为空,则说明数据库中根本没有该数据,也就没法登录
3.1email是否存在数据库中
如果user存在的话,就进行下一步验证,由于我事先已经存好了数据在数据库里,那就打印一下user查看它长什么样。
3.2password是否正确
验证密码是否正确的逻辑是:拿到该email在数据库中对应的密码,与(用户输入的登录密码)被加密后进行对比,如果==那验证成功。
为什么要加密再对比,因为之前我们在注册之后存入的密码数据就是以md5加密后的形式存在数据库当中的。
let DbPassword = user.dataValues.password //拿到数据库的密码
为了方便比较,写一个方法直接return出是否匹配。
const matchPWD= (DbPassword,LoginPassword)=>{
let loginpassword = md5Password(LoginPassword)
console.log(loginpassword,"loginpassword");
if(loginpassword==DbPassword){
return true
}
return false
}
调用方法:
const isMatch =await matchPWD(DbPassword,password)
如果相等/不等:
if(!isMatch){
throw new HttpException(401,"用户密码输入错误","password is not matched")
}
else{
delete user.dataValues.password; //删掉回显password这个敏感信息
user.dataValues.token = await sign(user.dataValues.username,user.dataValues.email)
return res.json({
data:user.dataValues //回显时的数据无password,多了一个token
})
}
4.返回数据
查看到res的信息全部符合就说明登录接口也成功了。