mongoDB사용법(4) (회원가입 추가로직)

KIP·2022년 10월 16일
0
post-thumbnail

이전에 회원가입 api가 정상적으로 설계된 것을 확인했다.

회원가입api로직 추가

Subdocument란 미들웨어나 커스텀 유효성 로직 등에 대해서 사용하는데, 개별적으로 되지않고 탑-레벨의 부모(현재는 register)가 저장될 때 사용된다.

미들웨어는 모델 로직을 원자화하는 데 유용하다.

가이드에 미들웨어가 있다.

테스트를 해보면, userData받음-> validation -> save-> userinfo 순으로 전달이 된다.
즉 pre는 api에서 데이터를 받고, DB에 저장하기 전에 실행되는 것이다.

pre에서 this는 인스턴스가 생성된 user의 정보를 받는다.
pre와 validation을 사용시 마지막에 next()를 이용해 빠져나간다. (그렇지 않으면 루프 내에서 머무르고 빠져나가지 않음)

../server/app.js

app.post("/api/register", (req, res) => {
    const user = new User(req.body);
    console.log(user + "userData 받음");
    user.save((err, userInfo) => {
        console.log( userInfo+"userInfo받음" );
        if (err) return res.json({ success: false, err });
        return res.status(200).json({
            success: true,
        });
    });
});

../server/models/User.js

userSchema.pre("validate", function (next) {
    const user = this;
    console.log(user + "validation 중");
    next();
});
userSchema.pre("save", function (next, err) {
    const user = this;
    console.log(user + "save중");
    next();
});

비밀번호 해쉬화(bcrypt)

api를 통해서 받아온 데이터를 DB에 담기 전 bcrypt를 이용해 암호화한다.

this는 데이터를 받아온 유저의 새 인스턴스를 가리키고 있고, 나머지는 bycrpt의 api명세를 확인한다.

../server/models/User.js
...
const bcrypt = require("bcrypt");
const saltRounds = 10;

userSchema.pre("save", function (next, err) {
    const user = this;
    bcrypt.genSalt(saltRounds, function (err, salt) {
        if (err) return next(err);
        bcrypt.hash(user.password, salt, function (err, hash) {
            if (err) return next(err);
            user.password = hash;
            next();
        });
    });
});

plainPassword를 hash된 비밀번호로 바꾼 후, Password를 살펴보면 암호화가 되었다.

아이디 중복체크

mongoose의 쿼리
CRUD기능을 도와주고, 반환은 쿼리객체로 된다.

findOne 쿼리로 User모델에서 아이디를 찾아 그 아이디와 같은 값이 있는지 확인

findById와 findOne은 거의 동일하다고 설명한다.

../server/index.js

app.post("/api/register", (req, res) => {

   //보내준 email이 User모델에도 존재하는지 찾고, 유저가 존재하면 알린다.
   
   User.findOne({ email: req.body.email }, (err, existUser) => {
        const user = new User(req.body);
        if (err) return console.log(err + "err");
        
        if (existUser) {
            return res
                .status(400)
                .json({ success: false, message: "중복된 이메일이 있습니다" });
        }

        user.save((err, userInfo) => {
            console.log(userInfo + "userInfo받음");
            if (err) return res.json({ success: false, err });
            return res.status(200).json({
                success: true,
            });
        });
    });
  
});

처음 Schema 작성 시에 email에는 unique: true라는 옵션을 넣었다.
인덱스의 제약조건을 위반하는 데이터가 이미 포함되어 있는 상태라면 지정된 인덱스 필드에 고유한 인덱스를 만들 수 없으니 조심.

0개의 댓글