Yêu cầu thg 4 22, 2022 8:50 SA 174 1 1
  • 174 1 1
+2

Validation request với Joi trong Express

Chia sẻ
  • 174 1 1

Mọi người cho mình hỏi sao mình dùng validate với enum như này là crash app nhỉ

validityStatus: Joi.string().valid('valid', 'invalid').default('valid')

còn mình dùng như thế này thì dc

validityStatus: Joi.string().allow('valid', 'invalid').default('valid'),

Nguyên code sẽ như thế này:

 const documentSchema = Joi.object().keys({
    validityStatus: Joi.string().allow('valid', 'invalid').default('valid'),
  });

  try {
    await documentSchema.validateAsync(req.body);
    next();
  } catch (error) {
    next(CreateError.BadRequest(error.message));
  }

Với thêm ở catch mình dùng throw CreateError.BadRequest(error.message) nó cũng crash luôn mình search một hồi vẫn k hiểu được vì sao

thg 4 22, 2022 9:42 SA

Bạn nên log đoạn log của Exception lên đây có lẽ mọi người sẽ dễ support hơn. Chứ không có log lỗi thì đoán mò cũng hơi tốn thời gian.

Avatar HungHocHoi @HungSmeb
thg 4 22, 2022 1:46 CH

@huukimit đây ạ Mình để gửi lên server là empty {} hoặc missing những trường required Phần trycatch

try {
    await userSchema.validateAsync(req.body);
    next();
  } catch (error) {
    next(CreateError(error.message));
  }

Chỗ catch

  1. Nếu mình để là throw CreateError.BadRequest(error.message); nó sẽ crash và báo như này image.png
  2. Nhưng mình để là next(CreateError(error.message)); thì nó sẽ bắn lỗi ở dạng json
{
    "message": "\"email\" is required"
}
Avatar Trình Đỗ @trinhvideo123
thg 4 23, 2022 2:16 SA

@HungSmeb

Trong trường hợp 1: Vì bạn ném ra Exception nhưng trong app lại không có code để catch nó nên ứng dụng bị crash.

Còn trong trường hợp 2. Khi bạn gọi hàm next thì exception lúc này sẽ được chuyển tới middleware tiếp theo, ở đó thì framework/thư viện đã xử lý giúp bạn nên app mới không bị crash và có cái message đẹp đẹp như vậy

Mình giải thích không chính xác lắm, nhưng cơ bản là vậy 😅

thg 4 23, 2022 6:16 SA

1 CÂU TRẢ LỜI


Đã trả lời thg 4 23, 2022 6:17 SA
Đã được chấp nhận
+1

Xem code bác @HungSmeb bổ sung thì có vẻ đúng như bác @trinhvideo123 nói. Mình cũng đồng quan điểm với @trinhvideo123 như vậy.

  1. Nếu bác để là throw CreateError.BadRequest(error.message); thì app nó sẽ bị dừng tại lệnh throw này gây crash.
  2. Nếu bác để là next(CreateError(error.message)); thì tức là bạn chuyển cái exception sang middleware tiếp theo để Express xử lý tiếp. Cái exception này khi qua middleware tiếp theo thì được trả thành response json như hình.
Chia sẻ
Avatar HungHocHoi @HungSmeb
thg 4 23, 2022 8:20 SA

Vâng, mình đã hiểu, vì mình để throw Error ở trong catch nên không có thằng nào nhận lấy cái lỗi đó, còn nếu throw ở trong try thì catch sẽ bắt được Mình cảm ơn 2 bạn đang giúp đỡ. Mình cứ ngỡ là throw ở trong catch thì nó cũng xử được luôn chứ.

Avatar duong van cong @duongvancong
thg 4 24, 2022 8:45 SA
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí