본문 바로가기

Project/TIL

20.03.17 ShareBook TIL

회원가입을 위한 signup server api를 작성해 보았다.

import { Router, Request, Response, NextFunction } from 'express';
import { Users } from '../../../models/Users';

const singup = Router();

singup.post('/', async (req: Request, res: Response, next: NextFunction) => {
  const { name, nickname, email, password, gender, region } = req.body;
  try {
    const users = await Users.findOne({
      where: {
        email: email,
        password: password,
      },
    }).then(data => {
      if (data) {
        res.status(409).send('이미 가입한 유저입니다');
      } else {
        Users.create({
          name: name,
          nickname: nickname,
          email: email,
          password: password,
          gender: gender,
          region: region,
        })
          .then(result => {
            if (result) res.json(result);
          })
          .catch(error => {
            console.log(error);
            res.sendStatus(500);
          });
      }
    });
  } catch (err) {
    console.error(err);
    next(err);
  }
});
export default singup;

 

class로 작성해보려다 이해가 잘 되지 않아 시간이 너무 많이 걸릴거 같아서 나중에 다시 작성해 보려고 한다.

아직 정확히 MVC패턴으로 나누어 진게 아니라서 작성한 파일을 main.ts에서 불러와 실행하였다.

포스트맨으로 작성하여 날려보니 table에 한글 설정이 되지 않아 한글은 넣을 수가 없었다.

SHOW CREATE TABLE 테이블명;   <= 테이블 인코딩 상태를 보여준다.
ALTER TABLE 테이블명 CONVERT TO character SET utf8;  <= utf8로 변경해준다.

유저 비밀번호를 해싱하였다.

// models/Users.ts

@AllowNull(false)
  @Column(DataType.TEXT)
  password: string | undefined;;

@BeforeCreate
  static beforeCreateHook(user: Users, options: any): void {
    const shasum = crypto.createHmac('sha512', '*****');
    shasum.update(user.password);
    user.password = shasum.digest('hex');
  }

  @BeforeFind
  static beforeFindHook(data: { where: { password: any } }): void {
    if (data.where.password) {
      const shasum = crypto.createHmac('sha512', '*****');
      shasum.update(data.where.password);
      data.where.password = shasum.digest('hex');
    }
  }

 

user.password에서 error : Argument of type 'string | undefined' is not assignable to parameter of type 'BinaryLike'.

라는 에러가 출력되었다. 대충 이해한 바로는  'string | undefined'는 'BinaryLike'타입의 파라미터에 넣을 수 없다는 에러인거 같았다.

  //@AllowNull(false)
  //@Column(DataType.TEXT)
  //password: string | undefined;
  
  @AllowNull(false)
  @Column(DataType.TEXT)
  password!: string;

 

로 변경하여 주었다.

비밀번호가 해싱되니 문자가 너무 길어져 할당한 값보다 더 커서 데이터베이스에 들어가지 않았다. 그래서 password는 TEXT타입으로 변경해 주었다.

 

'Project > TIL' 카테고리의 다른 글

20.03.19 ShareBook TIL  (0) 2020.03.20
20.03.18 ShareBook TIL  (0) 2020.03.19
20.03.16 ShareBook TIL  (0) 2020.03.17
20.03.15 ShareBook TIL  (0) 2020.03.16
20.03.14 ShareBook TIL  (0) 2020.03.15