持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
前言:
用户信息更新,即修改用户信息后更新数据库里的数据。控制器:updateUser
自从登录之后被分配了token,那么后来的 “用户信息获取”、“用户信息更新”等操作都应该在每次发送请求的时候验证主键是否存在数据库中,且是否已经携带token,如果这两个校验都通过的话,才能证明数据库中存在相应的数据可以被操作。
大致流程:
1.验证接口权限是否可以通过token这关
2.获取到请求数据:req.body.email
3.验证请求数据:使用email验证数据在数据库中是否存在
4.修改用户数据:
4.1获取请求数据:body数据 => 更新的信息
4.2数据字段判断:要更新的数据是否符合各种标准eg:不为空?是否合规?
4.3password更新:要加密
4.4进行更新操作
5.返回数据
5.1去除password敏感信息
5.2添加token
5.3返回用户json数据
正文
验证是否携带token
即在使用修改信息的控制器之前就要验证token,那么在路由之后立马安排上这个中间件。
router.put('/',authMiddleware,updateUser) //先中间件后控制器
获取email信息
因为email是数据库中唯一主键,所以我每次都是用email来findby数据库中是否已经存在这条数据。如果不存在,那说明根本没有该用户,进而抛出错误。(每次都要进行的操作)
const {email} = req.body.user;
const user = await User.findByPk(email);
if(!user){
throw new HttpException(401,"用户不存在","user is not found")
}
修改用户数据
1)获取请求数据
如果不存在,说明用户没有提交想要修改的数据。
const bodyUser = req.body.user;
if(!bodyUser){
throw new HttpException(401,"需要提交修改的数据","updateUser is not found")
}
2)数据字段判断
如果提交的字段有undefined的,那说明用户没有填写该条信息。这点在数据库中默认不进行更改,也就是说保留原来的数据。
如果提交的字段有null,那根据数据库初始定义的不允许为空来判断,会报错的,连数据库这关都过不了的。
const username = bodyUser.username
const bio = bodyUser.bio
const avatar = bodyUser.avatar
先获取到每一条数据,是undefined也不要紧,因为数据库默认保留原来的数据,所以无需写三元进行判断。
3)password更新:要加密
const password = bodyUser.password?md5Password(bodyUser.password):undefined
在获取是否修改密码的数据时要判断是否提交了密码,如果没有提交也要默认还设置为之前的密码。
如果提交了的话,由于数据库中存储的密码都为密文,所以要先将输入后的铭文使用md5方法加密后再存储进数据库。
4)更新
使用该条语句就是在更新数据库中的数据了。
let updateUser = await user.update({username,bio,avatar,password})
另外,如果想要修改特定条件下的数据,也可以一键操作。
比如:修改username全为小红的数据。
let updateUser = await User.update({username,bio,avatar,password},{
where:username="小红"
}
该语句的执行顺序为批量修改,指定条件.先找到username,然后修改所有数据库中username的数据。
返回数据
1)去除password敏感信息
let updateUser = await user.update({username,bio,avatar,password})
console.log(updateUser,"updateUser");//此刻打印的为修改后的信息
delete updateUser.dataValues.password; //删除敏感信息
2)添加token
因为token很可能已经超时/修改密码,都是要重新更换的。
let token = await sign(updateUser.username,email)
updateUser.dataValues.token = token;
3)返回数据
return res.status(200)
.json({
data:updateUser.dataValues
})
测试
好啦。可以运行一下了。测试更新一下名称和简介。
查看返回的数据:
查看数据库中的数据:
成功修改数据。user模块完结撒花。