Travajs рдХреЗ рд╕рд╛рде рдирдХрд╝реНрдХрд╝рд╛рд╢реА рдбреЗрдЯрд╛



рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдУрдкрдирд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдореИрдВ рдПрдХ рдФрд░ рдмрд╛рдд рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛: рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛рддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рдХреБрдЫ рднреА рд╣реЛ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП trava.js - рд░рд╕рджрд╛рд░ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВред рд╡реИрд╕реЗ, рд╣рдо рдЫрд╣ рдорд╣реАрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рдШрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдмрддрд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реВрдЦ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдкрдиреА рд╕рд╛рдВрд╕ рдкрдХрдбрд╝реЛред рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЛред

рд╕рдВрдХрд▓реНрдкрдирд╛


рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдПрдХ рддреБрдЪреНрдЫ рд╡рд┐рд╖рдп рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдорд╛рди рдпрд╛ рддреЛ рд╕рддреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЬреЛ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

function validate (value) { // any checking... if (!check(value)) return false; return true; } 

рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖ:

 function validate (value) { if (!check1(value)) return 'ERROR_1'; if (!check2(value)) return 'ERROR_2'; } 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдм рд╣реИ, рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред

рдпрджрд┐ рдПрдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ "рд▓реЗрдХрд┐рди"

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ, рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рдХрд┐ рдорд╛рдорд▓рд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд┐рдирд╛рдВрдХ, рд╕реЗрдЯ, рдпрд╛ рдЕрдиреНрдп рдХрд╕реНрдЯрдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ JSON рд╣реИ, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджреМрд░рд╛рди рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдбрдмрд▓ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдХреНрдпреЛрдВ рди рдЗрди рджреЛрдиреЛрдВ рдЕрд╡рд╕реНрдерд╛рдУрдВ рдХреЛ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд▓рд╕ рднреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдШреЛрд╖рдгрд╛рддреНрдордХ рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреАред

рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рдорд╛рди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рди рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐, рдмрд▓реНрдХрд┐ рдПрдХ рдХрдо рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреЗрдПрд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдХрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред

  1. рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЖрдо рд╣реИ [рддреНрд░реБрдЯрд┐, рдбреЗрдЯрд╛] рдЯрдкрд▓ рдХреА рд╡рд╛рдкрд╕реА:

     function validate (value) { if (!check1(value)) return ['ERROR_1']; if (!check2(value)) return ['ERROR_2']; return [null, value]; } 

    рдПрдХ рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕рд░рдгреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди {рддреНрд░реБрдЯрд┐, рдбреЗрдЯрд╛} рдСрдмреНрдЬреЗрдХреНрдЯ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ, рдорд╛рдЗрдирд╕ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рд░ рдЬрдЧрд╣ рдЖрдкрдХреЛ рдЗрд╕ рдЕрдиреБрдмрдВрдз рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдирджрд╛рд░ рд╣реИред
  2. рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рдорд╛рдирдХ рд╕реНрдерд┐рддрд┐ рд╣реИ, рдХреБрдЫ рднреА рдЕрд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЖрдХрд╕реНрдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реНрд╡рдпрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдк рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреЛрдб рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдереА, рдФрд░ рдореВрд▓реНрдп рдореЗрдВ рдирд╣реАрдВред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рд╣реИ - рдЕрдм рд╣рдореЗрд╢рд╛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдбрд╛рд▓рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЦреАрдВрдЪреВрдВрдЧрд╛ред
  4. рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрдирд╕реЗ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдлреЗрдВрдХ рди рджреЗрдВред

     function validate (value) { if (!check1(value)) return new Trava.ValidationError({ code: 401 }); if (!check2(value)) return new Trava.ValidationError({ code: 405 }); return parseOrTransform(value); // apply some parse or transform } 

рдореИрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдмрд╕ рдЧрдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рднреА рдПрдХ рд╕рдордЭреМрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред Trava.ValidationError рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдорд╛рдирдХ рддреНрд░реБрдЯрд┐ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдирд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред Trava.ValidationError рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдорд╛рдирдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рддрдм рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗрд╡рд▓ рддрд╛рд░ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдПрдХ рд╕реНрд╡рдЪреНрдЫ, рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рдореВрд▓реНрдп рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╣рдж рд╕рд░рд▓ред рдФрд░ рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрдВрдЬреАрд░реЛрдВ рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдореЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдШрд╛рд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧреАред

рд░рдЪрдирд╛


рд╕рдВрднрд╡рдд: рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд░рдЪрдирд╛ рд╣реИред рд░рдЪрдирд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╕рд┐рджреНрдз рдЬреЙрдп рдФрд░ v8n рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рд╡рд╕реНрддреБ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 Joi.string().alphanum().min(0).max(255) 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд╕реБрдВрджрд░ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрдИ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рдПрдХ рдШрд╛рддрдХ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдмрд╛рдд рд╣реИред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреАрдЬрд╝ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдореБрдЦреНрдп рдзреНрдпрд╛рди рдореМрдЬреВрджрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдФрд░ рдПрдХреАрдХрд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреЗрд╡рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╡рдЬрди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд▓реЗрдВред рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЫреЛрд░реЛрдВ рд╕реЗ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рдЯреНрд░рд┐рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдЪрд╛рдирдХ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЖрдкрдХреЛ рд▓реЛрдЕрд░рдХреЗрд╕ рдЖрджрд┐ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдИ рдЖрджрд┐рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдмреЗрдорд╛рдиреА рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рджреМрд░рд╛рди рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, c joi рдЕрдкрдиреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдШрд╛рд╕ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИред 0 рд╕реЗ 255 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг:

 //    const isNumber = n => typeof n == 'number' && !isNaN(n); //  const numberValidator = Trava.Check(isNumber); const byteValidator = Trava.Compose([ numberValidator, Trava.Check(n => 0 <= n && n < 256), ]); byteValidator(-1); // ! 

рдЪреЗрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕рддреНрдп рдЬрд╛рдВрдЪ (рдорд╛рди => рд╕рддреНрдп / рдЕрд╕рддреНрдп) рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рд╡реИрдзреАрдХреЛрдВ рдХреЛ рдЬрдВрдЬреАрд░ рдмрд╛рдВрдзреЛред рдЬрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рдж рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВред рдпрд╣ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЖрд╕рд╛рдиреА рд╣реИ, рдпрд╣ рдПрдХ рдорд╛рдиреНрдп рд╕рддреНрдпрд╛рдкрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдорд╛рдиреНрдпрддрд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЬрдЧрд╣ рдкрд░ рдЕрд╢рдХреНрдд рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдШрд╛рд╕ рдореЗрдВ рд╕рд╣рд╛рдпрдХ рд╕рдВрдЪрд╛рд▓рдХ рд╣реИрдВ:

 //   null  undefined const requiredNumberValidator = Trava.Required(numberValidator); requiredNumberValidator(undefined); // ! const optNumberValidator = Trava.Optional(numberValidator, 2); // 2 is default optNumberValidator(undefined); // 2 optNumberValidator(null); // null const nullNumberValidator = Trava.Nullable(numberValidator, 3); // 3 is default nullNumberValidator(undefined); // 3 nullNumberValidator(null); // 3 

рдШрд╛рд╕ рдореЗрдВ рдХрдИ рдФрд░ рд╕рд╣рд╛рдпрдХ рд╕рд╣рд╛рдпрдХ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рд╕реБрдВрджрд░ рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣ :)

рдЕрдиреБрдХреНрд░рдо


рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВред рдШрд╛рд╕ рдореЗрдВ рдРрд╕реЗ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ:

 //   const byteArrayValidator = Trava.Each(byteValidator); byteArrayValidator([1, -1, 2, -3]); // ValidationError: {"1":"Incorrect value","3":"Incorrect value"} //   const pointValidator = Trava.Keys({ x: numberValidator, y: numberValidator, }); pointValidator({x: 1, y: 'a'}); // ValidationError: {"y":"Incorrect value"} 

рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╕рдордп, рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЧрдВрднреАрд░рддрд╛ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рд╕рднреА рдХреБрдВрдЬреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ ( рдЖрд╡рд╢реНрдпрдХ рдореЗрдВ рд▓рд┐рдкрдЯреЗ)ред рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреБрдВрдЬреА рдЦрд╛рд░рд┐рдЬ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдХреБрдЫ jsonschema , рдЪрддреБрд░реНрдерд╛рдВрд╢ рд╕рдорд╛рдзрд╛рди рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП {x: 'рдирдВрдмрд░', y: 'рдирдВрдмрд░'}, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╛рди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╕рд░реНрдХрд┐рдЯ рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдФрд░ рд╡рд┐рдирд┐рдордп рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдкреАрдЫреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╛рдо рд╣реИрдВ рдФрд░ рдЬрд┐рдирдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред

рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдХрдореНрдкреЛрдЬрд╝ рдФрд░ рдХреАрдЬрд╝ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣ рд░реВрдЯ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдЯреНрд░рд╛рд╡рд╛ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:

 const pointValidator = Trava({ //  -> Keys x: [numberValidator, Trava.Check(v => v > 180)], //  -> Compose y: [numberValidator, Trava.Check(v => v < 180)], }); 

рдпрджрд┐ рдЖрдк рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЯреНрд░рд╛рд╡рд╛ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:

 const point = Trava({ x: [numberValidator, Trava.Check(v => v > 180)], y: [numberValidator, Trava.Check(v => v < 180)], }, //      { x: 200, y: 100, }); // { x: 200, y: 100 } 

рдЕрдм рддрдХ, рд╕рдорд░реНрдерди рдХреЗрд╡рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ JSON рдФрд░ рд╡рд╣ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╣рд░ рд╣реИред рд╡реЗрд▓рдХрдо рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдирд┐рд╡реЗрджрди рдХрд░реЗрдВ!

рдкреНрд░рд╕рдВрдЧ


рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рд╡реИрдз рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдЧрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЕрд╡рд╕рд░ рдЕрднреА рддрдХ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИред

рдХреБрдЫ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 const pos = Trava.Check(v => v > 0); pos(-1); // ValidationError: "Incorrect value" (by default) 

рдХрд┐рд╕реА рдПрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:

 const pos = Trava.Check(v => v > 0, "    "); pos(-1); // ValidationError: "    " 

рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:

 Trava.Check.ErrorMessage = " "; pos(-1); // ValidationError: " " 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЬреНрдпрд╛рджрд╛рддрд░ рд╣рдо рдХреЛрд╕ рдХреЗ рд╕рд╛рде рдмреИрдХрд╕рди рдкрд░ рдЬреЛрдВрд╕ рдХреЛ рдЬрд╣рд░ рджреЗрддреЗ рд╣реИрдВред рд╕рд╛рдордиреЗ рд╡рд╛рд▓рд╛ рднреА рдзреАрд░реЗ-рдзреАрд░реЗ рдЙрдарддрд╛ рд╣реИред рджреЛрдиреЛрдВ рд╕рд┐рд░реЛрдВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реЛрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдФрд░ рдЕрдм рдореИрдВ рд▓рдЧрднрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рд░реЛрдЧреА рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдФрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

 // validators.js const trava = require('trava'); const { isFilledString, isDate, isNumber } = require('../common/validators'); const patientSchema = { name: isFilledString, dateOfBirth: isDate, height: isNumber, } //        //      const patientNew = trava(patientSchema); //      const patientPatch = trava(mapValues(patientSchema, trava.Optional)); module.exports = { patientNew, patientPatch, }; // controllers.js const validate = require('./validators'); const { ValidationError } = require('../common/errors'); function create (ctx) { const patientData = validate.patientNew(ctx.request.body); //       Error,             Error if (patientData instanceof Error) return ValidationError(ctx, patientData); // ...create new patient } function update (ctx) { const patientData = validate.patientPatch(ctx.request.body); if (patientData instanceof Error) return ValidationError(ctx, patientData); // ...update patient data } 

рд╕рд╛рдорд╛рдиреНрдп / рддреНрд░реБрдЯрд┐рдпрд╛рдБред рдЬреЗрдПрд╕
const trava = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('trava');

рдлрдВрдХреНрд╢рди рд╡реИрд▓рд┐рдбреЗрд╢рди рдПрд░рд░ (ctx, params) {
рдЕрдЧрд░ (params Instof рддреНрд░реБрдЯрд┐) {
params = trava.ValidationError.extractData (params);
}
ctx.body = {
рдХреЛрдб: 'VALIDATION_ERROR',
рдкреИрд░рд╛рдореАрдЯрд░,
};
ctx.status = HttpStatus.BAD_REQUEST;
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕реЗ рд╕рд░рд▓реАрдХреГрдд рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡реЗрджрди рдореЗрдВ, рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдЬрдЯрд┐рд▓ рд╣реЛрдВрдЧреЗред рдЖрдк рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрджрд░реНрдн рдпрд╛ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рддреНрдпрд╛рдкрди рдХреЗ рдХрд╛рдо рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд╕рд░рд▓ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдФрд░ рд╕рд░рд▓ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рджреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: "рдЖрд╡рд╢реНрдпрдХ" рдФрд░ "рдЗрдиреНрд╡реЙрд▓реНрд╡", рдЬреЛ рдЦреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реАрдорд╛ рдкрд░ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╣реИрдВред рдЕрдиреНрдп рдЪреЗрдХ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрдВрдЬреАрдХрд░рдг рдкрд░ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ) рд╕рддреНрдпрд╛рдкрди рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрд╛рд╕ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


рдЗрд╕ рдЫреЛрдЯреЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд▓рдЧрднрдЧ рдкреВрд░реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛, рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рдмрд╛рд╣рд░ рдХрдИ рд╕рд╣рд╛рдпрдХ рд╣реИрдВ рдЬреЛ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдореИрдВ github github.com/uNmAnNeR/travajs рдкрд░ рд╡рд┐рд╡рд░рдг рдорд╛рдВрдЧрддрд╛ рд╣реВрдВред

рд╣рдореЗрдВ рдПрдХ рдРрд╕реЗ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрд┐рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рд╢рд╛рдирджрд╛рд░ рди рд╣реЛ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣реИред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред рдореИрдВ рдЗрдЪреНрдЫрд╛рдУрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛ред
рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд▓рд┐рдПред

Source: https://habr.com/ru/post/hi462189/


All Articles