MongoServerError: E11000 duplicate key error collection:

iiingkeep·2024년 5월 15일

Errors

목록 보기
4/6

MongoServerError: E11000 duplicate key error collection:


상황: 새로운 유저를 생성하는 join 페이지에서 이미 등록되어 있는 이메일과 같은 이메일 또는 유저네임으로 유저 생성을 시도했을 때 에러 발생




mongoDB를 사용중이며 유저 스키마는 다음과 같다.

const userSchema = new mongoose.Schema({
  email: {type: String, required: true, unique: true},
  username: {type: String, required: true, unique: true},
  password: {type: String, required: true},
  name: {type: String, required: true},
  location: String,
});

email과 username을 unique로 설정해놓은 상태다.

mongoDB에 저장되어 있는 데이터는 다음과 같다.
MongoServerError: E11000 duplicate key error collection:

이때 아래와 같이 이미 등록되어 있는 이메일과 같은 이메일로 유저를 생성하려고 해 봤다.
MongoServerError: E11000 duplicate key error collection:

그랬더니 발생한 에러는 다음과 같다
MongoServerError: E11000 duplicate key error collection:

스키마 생성 시 email과 username 항목에는 unique 조건을 입력해놨는데 해당 항목에 대해 중복된 데이터를 데이터베이스에 생성하려고하니 에러가 발생하는 것이다.
에러가 발생하기 전에 중복된 데이터가 있는지 확인 후 중복 데이터가 있다면 유저가 다른 데이터를 입력해 가입할 수 있도록 중복된 데이터가 존재함을 알리는 로직이 있어야 한다.
따라서 해당 로직을 유저 컨트롤러에 추가해준다.


원래의 userController.js 코드

export const postJoin = async(req,res) => {
  const {name, username, email, password, location} = req.body;
  const pageTitle = Join;
  return res.render('join', {pageTitle});
  }

추가 완료 된 userController.js 코드

export const postJoin = async(req,res) => {
  const {name, username, email, password, location} = req.body;
  const pageTitle = 'Join';
  const exists = await User.exists({$or: [{username}, {email}]});
  if (exists) {
    return res.render('join', {
      pageTitle,
      errorMessage: 'This username/email is already taken',
    });
  }

여기에선 mongoDB가 지원하는 'or' operator를 사용해봤다. 중복을 피하기 위해 unique 설정을 했던 username과 email 항목에 대해 유저가 입력한 데이터가 이미 존재하는지 User.exists()로 true/false값을 exists라는 변수에 담은 뒤 if문으로 처리했다.

확인을 위해 같은 email 또는 username으로 join을 시도하니 페이지가 렌더링 되고 에러문구가 출력되었다.
MongoServerError: E11000 duplicate key error collection:
MongoServerError: E11000 duplicate key error collection:
MongoServerError: E11000 duplicate key error collection:

원인: mongoDB 스키마 생성 시 특정 조건을 지정한 항목에 대해 유저가 적합하지 않은 데이터를 입력할 경우 에러 발생

해결: 에러가 발생할만한 상황에 대한 전처리를 해준다. 여기에선 데이터 존재 유무를 먼저 파악하고 중복된 데이터 존재시 페이지를 새로고침 한 뒤 유저에게 메세지를 전달하도록 처리했다.

profile
혁신적인 백엔드 개발자가 되고자, 기록✏️

0개의 댓글