Node-web05-03博客系统注册

注册功能

代码

注册 sign_up

  • 新建pages/sign_up.tsx
  • 代码

验证用户名唯一性

  • yarn m:create -n AddUniqueUsernameToUsers
1
2
3
4
5
6
7
8
9
10
11
12
13
14
export class AddUniqueUsernameToUsers1613632711836 implements MigrationInterface {

public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createIndex('users',
new TableIndex({
name: 'users_username', columnNames: ['username'],
isUnique: true
}));
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropIndex('users', 'users_username');
}
}

此时在创建同名 user的时候 就会报错

数据校验

  • 数据库层校验
    • 返回数据库报错msg
    • 兜底,可以不做,不过会导致数据混乱
  • 后台应用层校验

    • 必须做,这里存在问题是存在并发,多个用户 注册时候 found分别为 null就会跳过,所以还是要做 数据库层的校验
      1
      2
      3
      4
      const found = connection.manager.find(User,{username})
      if (found) {
      errors.username.push('已存在,不能重复注册');
      }
  • 前端校验

    • 有的时候做不了

小知识点 mac查看端口占用

1
2
3
4
5
6
7
lsof -i tcp:8080 

该命令会显示占用8080端口的进程,有其 pid ,可以通过pid关掉该进程

杀死进程

kill pid

将校验逻辑放到 entity 里

加密密码操作放到 User里

  • typeorm 钩子函数
1
2
3
4
@BeforeInsert()
generatePasswordDigest() {
this.passwordDigest = md5(this.password);
}

隐藏 JSON 中的部分字段

  • 使用 “lodash” 的 omit功能,过滤不要序列化的字段
1
2
3
toJSON() {
return _.omit(this, ['password', 'passwordConfirmation', 'passwordDigest', 'errors']);
}