08-blog-用户更新

102 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
                  })

测试

好啦。可以运行一下了。测试更新一下名称和简介。

image.png

查看返回的数据:

image.png

查看数据库中的数据:

image.png

成功修改数据。user模块完结撒花。