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

рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
throw
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдореЗрдВ
throw
рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЛ "рдирд┐рдпрдВрддреНрд░рдХ" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ "рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
app.post('/testing', (req, res) => { throw new Error('Something broke! ') })
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ (рд╣рдо рдиреАрдЪреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ), рддреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛ред
рдпрд╣рд╛рдБ рдорд╛рдирдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:
- HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЛ 500 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
- рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЗрдХрд╛рдИ рдХреЛ рдПрдХ рдкрд╛рда рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИред
- рдХрдВрд╕реЛрд▓ рдкрд░ рдПрдХ рдкрд╛рда рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИред
рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
next
рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
app.post('/testing', async (req, res, next) => { return next(new Error('Something broke again! ')) })
рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓реЙрдЧ рдХрд░рддреЗ рд╕рдордп рдХрдВрд╕реЛрд▓ рдХреЛ рдпрд╣реА рдорд┐рд▓рддрд╛ рд╣реИред
рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ async / wait рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ
рдПрдХреНрд╕рдкреНрд░реЗрд╕-async-рд╣реИрдВрдбрд▓рд░ рдЬреИрд╕реЗ рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдмрд┐рдирд╛
рдХреЛрд╢рд┐рд╢ / рдмреНрд▓реЙрдХ рдХреЛ
рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред
const asyncHandler = require('express-async-handler') app.post('/testing', asyncHandler(async (req, res, next) => {
рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЛ
express-async-handler
рдореЗрдВ рд▓рдкреЗрдЯреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░,
throw
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддреНрд░реБрдЯрд┐
throw
ред рдпрд╣ рддреНрд░реБрдЯрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдЧреАред
app.post('/testing', asyncHandler(async (req, res, next) => { throw new Error('Something broke yet again! ') }))
рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢рдЕрдкрдиреА рдЦреБрдж рдХреА рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд▓реЗрдЦрди
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ 4 рддрд░реНрдХ рд▓реЗ:
- рддреНрд░реБрдЯрд┐
- рдЕрдиреБрд░реЛрдз
- рд░реЗрд╕
- рдЕрдЧрд▓рд╛
рдЖрдкрдХреЛ рдордзреНрдпрд╡рд░реНрддреА рд╣реИрдВрдбрд▓рд░ рдФрд░ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
app.use() app.get() app.post() app.put() app.delete()
рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдорд╛рдирдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдПрдХ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдмрдирд╛рдПрдВ рдФрд░ рднреЗрдЬреЗрдВред
- рдлреЙрд░реНрдо рдФрд░ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЙрддреНрддрд░ рднреЗрдЬреЗрдВред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреМрди рд╕рд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдЙрдкрдпреБрдХреНрдд рд╣реИ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛ред рдпрд╣рд╛рдВ рдЙрди рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рддреНрд░реБрдЯрд┐
400 Bad Request
ред рджреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░реЗрдбрд┐рдЯ рдХрд╛рд░реНрдб рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рд▓рд╛ рдлрд╝реАрд▓реНрдб рднреЗрдЬреЗ рдЧрдП рднреБрдЧрддрд╛рди рдлрд╝реЙрд░реНрдо рдореЗрдВ рдирд╣реАрдВ рднрд░рд╛ рдЧрдпрд╛ рдерд╛)ред рджреВрд╕рд░реЗ, рдЬрдм рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЧрд▓рдд рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рд╕рд╡рд░реНрдб рдлрд╝реАрд▓реНрдб рдореЗрдВ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдкреБрд╖реНрдЯрд┐ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдирд╛)ред - рддреНрд░реБрдЯрд┐
401 Unauthorized
ред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЧрд▓рдд рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ (рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдИрдореЗрд▓ рдкрддрд╛ рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб) рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред - рддреНрд░реБрдЯрд┐
403 Forbidden
ред рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред - рддреНрд░реБрдЯрд┐
404 Not Found
ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 500 Internal Server Error
ред рдпрд╣ рддрдм рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдлреНрд░рдВрдЯ-рдПрдВрдб рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЧрдпрд╛ рдЕрдиреБрд░реЛрдз рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмреИрдХ-рдПрдВрдб рдкрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐ рд╣реБрдИред
рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ
res.status
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
app.use((error, req, res, next) => {
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛрдб рднреЗрдЬреЗрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛
http-рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреИрдХреЗрдЬ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рддреАрди рдЯреБрдХрдбрд╝реЗ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдбред
- рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╕рдВрджреЗрд╢ред
- рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдЬрд┐рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ)ред
http-errors
рдкреИрдХреЗрдЬ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm install http-errors --save
рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ:
const createError = require('http-errors')
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдареАрдХ рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕рдХреЗ рдИрдореЗрд▓ рдкрддреЗ рдкрд░ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд╣рдо
User not found
рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ
User not found
рддреНрд░реБрдЯрд┐ рднреЗрдЬрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред
рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдпрд╣реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЛ
400 Bad Request
рд╕реЗрдЯ рдХрд░реЗрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЧрд▓рдд рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛)ред рдпрд╣ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛ред - рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ рдЬреИрд╕реЗ
User not found
ред рдпрд╣ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛ред
app.put('/testing', asyncHandler(async (req, res) => { const { email } = req.body const user = await User.findOne({ email })
рдЖрдк
error.status
рдирд┐рд░реНрдорд╛рдг, рдФрд░
error.message
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдорддрдм рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐
res.status
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХреА
res.status
, рдФрд░ рд╕рдВрджреЗрд╢
res.json
рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
app.use((error, req, res, next) => {
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЛрдб, рд╕рдВрджреЗрд╢ рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкрд░рд┐рдгрд╛рдо рднреЗрдЬрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддреА рд╣реИред
app.use((error, req, res, next) => {
Code рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб
рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕реНрд░реЛрдд
createError
рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕
status
рдкреНрд░реЙрдкрд░реНрдЯреА рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ
fs.readFile
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреИрд░-рдореМрдЬреВрдж рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
const fs = require('fs') const util = require('util')
рдРрд╕реА рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ
status
рдЧреБрдг рдирд╣реАрдВ рд╣реЛрдЧрд╛:
app.use((error, req, res, next) => { console.log('Error status: ', error.status) console.log('Message: ', error.message) })
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдордРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо
500 Internal Server Error
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
app.use((error, req, res, next) => { res.status(error.status || 500) res.json({ status: error.status, message: error.message, stack: error.stack }) })
Code рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ
400 Bad Request
рддреНрд░реБрдЯрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝рдиреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдкрдХреЛ
createError
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ
createError
:
app.get('/testing', asyncHandler(async (req, res, next) => { try { const { file } = req.body const contents = await readFilePromise(path.join(__dirname, file)) } catch (error) { throw createError(400, `File ${file} does not exist`) } })
тЦН 404 рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ
рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рд╣реИрдВрдбрд▓рд░ рдФрд░ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд░реВрдк рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛ред
404 Not Found
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╛рд░реНрдЧреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмреАрдЪ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ 404 рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдгHT ERR_HTTP_HEADERS_SENT рддреНрд░реБрдЯрд┐ рдиреЛрдЯ
рдпрджрд┐ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢
ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent to the client
рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рддреЛ
ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent to the client
ред рдпрд╣ рдЙрдарддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕реА рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ:
- res.send
- res.json
- res.render
- res.sendFile
- res.sendStatus
- res.end
- res.redirect
рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ
res.render
рдФрд░
res.json
рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐
ERR_HTTP_HEADERS_SENT
:
app.get('/testing', (req, res) => { res.render('new-page') res.json({ message: '┬п\_(уГД)_/┬п' }) })
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрджрд┐ рдЖрдк рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдРрд╕реА рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рдХрд╣рд▓рд╛рддреА рд╣реИрдВред
тЦН рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдФрд░ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ
рдпрджрд┐ рдлреНрд░рдВрдЯрдПрдВрдб рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕реА рддреНрд░реБрдЯрд┐
ERR_HTTP_HEADERS_SENT
рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдорд╛рдирдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд╣реИрдВрдбрд▓рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рднреЗрдЬреЗрдЧрд╛ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред
app.use((error, req, res, next) => {
рдкрд░рд┐рдгрд╛рдо
рдЖрдЬ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрддрд╛рдпрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдЖрдк рдЕрдкрдиреА Node.js рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ?
