Asked Apr 22nd, 2022 8:50 a.m. 173 1 1
  • 173 1 1
+2

Validation request với Joi trong Express

Share
  • 173 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

Apr 22nd, 2022 9:42 a.m.

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.

0
| Reply
Share
Avatar HungHocHoi @HungSmeb
Apr 22nd, 2022 1:46 p.m.

@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"
}
0
| Reply
Share
Avatar Trình Đỗ @trinhvideo123
Apr 23rd, 2022 2:16 a.m.

@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 😅

0
| Reply
Share
Apr 23rd, 2022 6:16 a.m.

1 ANSWERS


Answered Apr 23rd, 2022 6:17 a.m.
Accepted
+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.
Share
Avatar HungHocHoi @HungSmeb
Apr 23rd, 2022 8:20 a.m.

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ứ.

0
| Reply
Share
Avatar duong van cong @duongvancong
Apr 24th, 2022 8:45 a.m.
Viblo
Let's register a Viblo Account to get more interesting posts.