[MongoDB] Mongoose - 스키마 유효성 검

Zero·2023년 3월 14일
0

MongoDB

목록 보기
11/14

Schema 유효성 검사

내장된 제약 조건

Schema 타입 & 속성 & 제약조건 알아보기

Required

const productSchema = Schema({
  name: {
    type: String,
    // 에러메시지를 커스텀화 
    required: [true, "상품 이름이 필요합니다."],
  },
  price: {
    type: Number,
    required: true,
  },
});
  • name이 required 인데, model을 생성할 때 생략하면 오류가 발생한다.


Type

type : String , type : Number 와 같이 type 을 명시하고, 해당 타입에 맞지 않는 값을 모델 생성시 부여하면 오류가 발생한다.

const productSchema = Schema({
  name: {
    type: String,
    // 에러메시지를 커스텀화 
    required: [true, "상품 이름이 필요합니다."],
  },
  price: {
    type: Number,
    required: true,
  },
});

const bike = new Product({name:'fast bike' , price: "hello"});

--> Number type에 String 타입을 부여하여 오류가 발생함



스키마에 정의하지 않은 정보 입력

const productSchema = Schema({
  name: {
    type: String,
    // 에러메시지를 커스텀화 
    required: [true, "상품 이름이 필요합니다."],
  },
  price: {
    type: Number,
    required: true,
  },
});

const bike = new Product({name:'fast bike' , price: "hello", color:"red"});

다음과 같이 Schema에는 color가 없는데 모델 생성시 해당 정보를 입력하게 되면 오류는 발생하지 않고 무시하여 생략된다.



Default

const productSchema = Schema({
  name: {
    type: String,
    required: [true, "상품 이름이 필요합니다."],
  },
  price: {
    type: Number,
    required: true,
  },
  // onSale property 추가
  onSale: {
    type: Boolean,
    default: false,
  },
});

// Schema에 정의는 했지만 값을 넣지 않을경우 default로 설정했던 값이 들어감
...

const bike = new Product({ name: "Mountain Bike", price: 599});

onSale의 default 값을 false로 설정해놨기 때문에 모델 생성시 값을 주지 않아도 default 값으로 부여된다.



업데이트 유효성 검사하기

const productSchema = Schema({
  name: {
    type: String,
    required: true,
    maxlength: 20,
  },
  price: {
    type: Number,
    required: true,
    min : 0,
  },
  onSale: {
    type: Boolean,
    default: false,
  },
  categories : [String],
  qty : {
    online: {
      type: Number,
      default: 0,
    },
    inStore: {
      type: Number,
      default: 0,
    }
  }
});

const bike = new Product({
  name: "Tire Pump",
  price: 19.5,
  categories: ["Cycling"],
});

bike.save()
  .then((data) => {
    console.log("It Worked!!!");
    console.log(data);
  })
  .catch((err) => {
    console.log("ERROR!!!");
    console.log(err);
  });
> node index.js
Connection Open
It Worked!!!
{
  name: 'Tire Pump',
  price: 19.5,
  onSale: false,
  categories: [ 'Cycling' ],
  qty: { online: 0, inStore: 0 },
  _id: new ObjectId("63d66ea2821c87ce860fe862"),
  __v: 0
}
  • 해당 price를 min 으로 설정해둔 0보다 작은 음수값으로 변경하게 되면, 그대로 변경이 이루어진다. (유효성 검사의 의미가 없이 음수로 나온다.)

그 이유는 Mongoose는 원래 그런 방식으로 작동을 하게 되는데, 업데이트를 하면서도 유효성검사를 계속해서 하도록 하려면 다음과 같은 속성을 true로 변경해주어야 한다.

Product.findOneAndUpdate(
  { name: "Tire Pump" },
  { price: -19.99 },
  { new: true, runValidators: true }
)
  .then((data) => {
    console.log("It Worked!!!");
    console.log(data);
  })
  .catch((err) => {
    console.log("ERROR!!!");
    console.log(err);
  });
  • runValidators : true (해당 설정을 하면 업데이트시에도 오류값을 잡아낼 수 있다)

0개의 댓글