유저 생성

PSK·2021년 7월 6일
0

eatingSimple

목록 보기
2/3

Apollo Server 생성

const apollo = new ApolloServer({
  resolvers,
  typeDefs,
  uploads: false,
  context: async ({ req }) => {
    return { loggedInUser: await getUser(req.headers.token) };
  },
});
  • Query, Mutation, computed fields를 처리해주는 resolvers와 typeDefs을 넣어준다.(resolvers와 typeDefs는 schema.js에서 export된 것 으로, 존재하는 모든 resolver와 typeDef들을 불러온 후, merged 된 형태이다.)

  • uploads는 apollo server에서 파일 업로드를 위해 기본으로 제공되는 건데 오류를 많이 일으켜서 false로 설정하고, grapql-upload 모듈을 따로 설치해서 이용한다.

  • context는 모든 resolver에서 접근 할 수 있는 변수로 활용이 가능하다. 이것을 login에 활용하면, user가 login할 때 backend는 token을 발급하고, frontend에서 이 token을 http header에 token이라는 변수로 backend에 보내면 따로 정의한 getUser() 함수로 user를 식별한다.


type User 정의

스키마에 정의한 것과 같이, User를 이렇게 정의해주었다.

type User {
    id: Int!
    name: String!
    username: String!
    email: String!
    password: String!
    bio: String
    avatar: String
    isMe: Boolean!
    createdAt: String!
    updatedAt: String!
  }

여기서 isMe는 로그인된 유저가 어떤 유저의 정보를 볼 때 본인인지(본인이라면 프로필이나 게시물을 수정 가능) 아닌지 구분하기 위한 computed fields로, 실제 db에 저장되는 것은 아니다.

따라서 따로 resolver를 만들어 isMe가 어떻게 계산될 것인지 정의해주는데, 이와 같이 정의했다.

User: {
    isMe: ({ id }, _, { loggedInUser }) => {
      if (loggedInUser) return id === loggedInUser.id;
      else return false;
    },
  },
  • user의 id를 parent로 받고, loggedInUser 정보를 context로 받는다.
  • 만약 로그인된 상태라면 로그인 유저와 해당 유저의 id를 비교하고, 로그아웃 상태라면 당연히 false를 return한다.

createAccount

createAccount(
      username: String!
      email: String!
      password: String!
      name: String!
      avatar: Upload
      bio: String
    ): MutationResult!
  • 계정을 생성하는 필수 조건은 username, email, password, name이다.
  • MutationResult는 다른 mutation에서도 많이 쓰일 것이기 때문에 따로 정의해주었는데, 다음과 같다.
type MutationResult {
    ok: Boolean!
    error: String
  } 

mutation이 성공적이면 ok : true, 실패하면 ok : false, error: "에러 내용"을 return 한다.

resolver는 일단 username과 email을 검색해서 이미 사용중이면 Error를 던진다.

-> 사용중이 아니라면 ?

const uglyPassword = await bcrypt.hash(password, 10);

bcrypt로 password를 hashing한다. 그리고,

await client.user.create({
          data: {
            username,
            email,
            name,
            bio,
            password: uglyPassword,
          },
        });

prisma client로 새로운 유저 생성!(password는 반드시 hashing된 password로 저장) 그리고 ok: true를 return하면 끝이다!

-> 만약 문제가 생겼다면 ?

catch (e) {
        return {
          ok: false,
          error: "Can't create account.",
        };
      }

에러를 catch하고 에러 메시지를 return 해준다.

profile
개발잘하고싶다

0개의 댓글