ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • join - controller
    Project using node.js/Cloning Youtube 2020. 8. 24. 11:49

    User.js

    import passportLocalMongoose from "passport-local-mongoose";
    UserSchema.plugin(passportLocalMongoose, { usernameField: "username" });

    userController.js에서 User.register를 사용하려면 User.js에서 다음 2줄의 코드를 반드시 추가해줘야 한다.

    userController.js

    export const getJoin = (req, res) => {
      try {
        res.render('join', { pageTitle: 'Join' });
      } catch (error) {
        console.log(error);
        res.redirect(routes.home);
      }
    };
    
    export const postJoin = async (req, res) => {
      const {
        body: { name, email, password, password2 },
        file,
      } = req;
      console.log(file);
      if (password !== password2) {
        res.status(400);
        res.redirect(routes.home);
      }
      try {
        const user = await User({
          name,
          email,
          avatarUrl: file
            ? file.path
            : '<이미지가 있는 주소>',
        });
        await User.register(user, password);
      } catch (error) {
        console.log(error);
        res.redirect(routes.join);
      }
    };

      유저의 요청이 방식이 get이냐 post냐에 따라 controller의 join을 나눴다. postJoin을 보면 async & await를 사용했다. 일단 먼저 사용자로부터 req.body 값을 받는다.(req.body는 body-parser로 인해 생겨났다.) 사용자의 비밀번호와 재확인 비밀번호가 맞지 않았을 경우 http status code 400번을 보낸다.

      const user = await User({})는 MongdoDB 모델에 name, email, avatarUrl을 저장한다. 하지만 저장하는데 시간이 걸리고 JS는 비동기처리를 하기 때문에 저장이라는 명령을 시킨 동시에 다음 코드를 진행한다. 저장이 완료되지 않고 다음 코드인 User.register()를 실행하게 되면 당연히 error가 발생한다. 그렇기 때문에 async await를 사용해서 User 안에 데이터가 다 저장이 될 때까지 기다린다. 그 후에 User.register를 이용해서 사용자 정보와 password를 저장한다. 이것 역시 await를 사용한다.

     

    참고 자료

    소스 코드

    https://github.com/zpskek/wetube-v3/commit/ae933b3e0d5568f1f411c7eb70ff857fce5baf75

    'Project using node.js > Cloning Youtube' 카테고리의 다른 글

    login - controller  (0) 2020.08.24
    login - view  (0) 2020.08.24
    passport.js  (0) 2020.08.24
    multer  (0) 2020.08.24
    join - view  (0) 2020.08.24

    댓글

Designed by Tistory.