
рдЬрдм рдЖрдк рдЕрдкрдиреЗ NodeJS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкрдардиреАрдп рд▓реЙрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ? рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдордЭрджрд╛рд░ рдорд╛рдирдХреЛрдВ рдХреА рдХрдореА рд╕реЗ рдмреЗрд╣рдж рдкрд░реЗрд╢рд╛рди рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдирд┐рд░рдВрддрд░рддрд╛-рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдпрд╛ рд╕реАрдПрд▓рдПрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд▓ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред
рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде NodeJS рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдкреБрд░рд╛рдиреЗ, рдкреБрд░рд╛рдиреЗ, рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдореЗрдВ, рдЬрдм рд╕реНрддрдирдзрд╛рд░реА рдЕрднреА рднреА рдкреГрдереНрд╡реА рдкрд░ рдЪрд▓реЗ рдЧрдП рдереЗ, рддреЛ рд╕рднреА-рд╕рднреА-рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рдмрдирд╛рдпрд╛ред рдЗрд╕ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдПрдХ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рдирд╛ рддреБрдЪреНрдЫ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдереНрд░реЗрдб-рд▓реЛрдХрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдпрд╛ рдЯреАрдПрд▓рдПрд╕ рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬреЛ рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХрд┐рд╕реА рднреА рдлрдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдк рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдХреЛ рд░рд┐рдбреАрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЯреАрдПрд▓рдПрд╕ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕реЗрд╡рд╛ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ NodeJS рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдПрдирдУрдбреАрдЬреЗрдПрд╕ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╣реИ (рдХрд╛рдлреА рдирд╣реАрдВ, рд╢реНрд░рдорд┐рдХреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рднреАрддрд░, рд╢реНрд░рдорд┐рдХ рдХреЛрдИ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддреЗ рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рдЖрдк рдЯреАрдПрд▓рдПрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдкреНрд░рддрд┐рдорд╛рди рдЕрд▓рдЧ рд╣реИ - рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдХреЗ рднреАрддрд░ рд╡рд┐рднрд┐рдиреНрди рдХреЙрд▓рдмреИрдХ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЯреЙрдЧрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЗрд╕ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рднреЗрдЬреЗрдВ, рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдордп рджреЗрдВ (рдпрджрд┐ рдЖрдк рдЗрд╕ рдЪреАрдЬ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЧрд░реНрд╡ рд╕реЗ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рд╣реБрдб рдХреЗ рддрд╣рдд, рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ)ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ NodeJS рдХреИрд╕реЗ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХрдм рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдХреБрдЫ рдЖрдИрдбреА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, NodeJS рдХреЗ рдкрд╛рд╕ рдПрдХ рдПрдкреАрдЖрдИ рднреА рд╣реИ рдЬреЛ рдЗрди рдЖрдИрдбреА рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рд╛рдЪреАрди рдХрд╛рд▓ рдореЗрдВ, рдЬрдм рдореИрдорде рд╡рд┐рд▓реБрдкреНрдд рд╣реЛ рдЧрдП, рд▓реЗрдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрднреА рднреА рдХреЗрдВрджреНрд░реАрдп рд╕реАрд╡реЗрдЬ рдХреЗ рд▓рд╛рднреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдерд╛, (NodeJS v0.11.11) рд╣рдорд╛рд░реЗ рдкрд╛рд╕ addAsyncListener рдерд╛ред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдлреЙрд░реЗрд╕реНрдЯ рдиреЙрд░рд╡реЗрд▓ рдиреЗ рдирд┐рд░рдВрддрд░рддрд╛-рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдпрд╛ рд╕реАрдПрд▓рдПрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдпрд╛ред рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреА рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдПрдкреАрдЖрдИ (рдореИрдВ addAsyncLustener рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рдиреЗ рд▓рдВрдмреЗ рдЬреАрд╡рди рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ред рдЙрдирдХреА рдореГрддреНрдпреБ NodeJS v0.12 рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХреА рдереАред
NodeJS 8 рд╕реЗ рдкрд╣рд▓реЗ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреА рдХрддрд╛рд░ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕рдВрд╕реНрдХрд░рдг 8 рдореЗрдВ, NodeJS рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдиреНрдпрд╛рдп рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рд╣рдореЗрдВ async_hooks API рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк async_hooks рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВред Async_hooks рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкрд┐рдЫрд▓реЗ рд╕реАрдПрд▓рдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреБрди: рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ cls-hooked рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╕реАрдПрд▓рдПрд╕
рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, CLS рдСрдкрд░реЗрд╢рди рд╕реНрдХреАрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдЖрдЗрдП рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рд▓реЗрдВ:
- рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирдпрд╛ рд╕реАрдПрд▓рдПрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдмрдирд╛рдПрдВред рдПрдХ рдмрд╛рд░ рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд▓рд┐рдПред
- рджреВрд╕рд░реЗ, рд╣рдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реАрдПрд▓рдПрд╕ рд╕рдВрджрд░реНрдн рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред
- рдЬрдм рдХреЛрдИ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдЖрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдорд┐рдбрд▓рд╡реЗрдпрд░ (рдлрдВрдХреНрд╢рди # 1) рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдПрдХ рдирдпрд╛ рд╕реАрдПрд▓рдПрд╕ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ (рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк Namespace.run рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред Namespace.run рдореЗрдВ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рд╕реАрдПрд▓рдПрд╕ рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдореИрдк рдореЗрдВ рдПрдХ рддрд╛рдЬрд╝рд╛ рдмрдирд╛рдпрд╛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддрд╛ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдПрд▓рдПрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рдкрд╛рд╕ рдПрдХ
active
рд╕рдВрдкрддреНрддрд┐ рд╣реИред рд╕реАрдПрд▓рдПрд╕ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред - рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреНрд╡реЗрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВред рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
- рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЗрдирд┐рдЯ рд╣реБрдХ рдЖрдЧ ред рдпрд╣ async рдЖрдИрдбреА (рдирдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреА рдЖрдИрдбреА) рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЛ рдореИрдк рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
- рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд╛ рдЕрдм рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
- рд╣реБрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирд╛рдорд╛рдВрдХрд┐рдд рд╡реНрдпрдХреНрддрд┐ рдХреЛ
active
рд╕рдВрдкрддреНрддрд┐ рдХреЛ undefined
(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП)ред - рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реБрдХ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ ред рдпрд╣ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдПрд╕рд┐рдВрдХреНрд╕ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ (рдпрд╣ рдкрд╣рд▓реЗ рдХреЙрд▓рдмреИрдХ рдХреА рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рдХреЗ рд╕рдорд╛рди рд╣реИ)ред
- рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреНрд╡реЗрд░реА рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдХреЙрд▓рдмреИрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдкрд╣рд▓реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реБрдХред рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рджреВрд╕рд░реЗ рдСрдкрд░реЗрд╢рди (рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА) рдХреЗ async рдЖрдИрдбреА рдХреЗ рд╕рдорд╛рди рд╣реИред рдирд╛рдорд╕реНрдерд╛рди
active
рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдВрджрд░реНрдн рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рд╕рдВрджрд░реНрдн рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛ред - рдЕрдм рджреВрд╕рд░рд╛ рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╢реИрддрд╛рди рдирд╛рдЪ рд░рд╣реЗ рд╣реИрдВ, рд╡реЛрджрдХрд╛ рдбрд╛рд▓ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрдВрджрд░, рд╣рдо рдХреБрдВрдЬреА рд╕реЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдХреЛрдИ рднреА рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реАрдПрд▓рдПрд╕ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ рджреА рдЧрдИ рдХреБрдВрдЬреА рдХреЛ рдЦреЛрдЬрдиреЗ рдпрд╛
undefined
рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред - рдЗрд╕ рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдХреЗ рдмрд╛рдж рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд╛рдо рд╕реНрдерд╛рди рдХреА
active
рд╕рдВрдкрддреНрддрд┐ рдХреЛ undefined
ред - рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реБрдХ рдЖрдЧ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ ред рдпрд╣ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдПрд╕рд┐рдВрдХреНрд╕ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ (рдпрд╣ рджреВрд╕рд░реА рдХреЙрд▓рдмреИрдХ рдХреА рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рдХреЗ рд╕рдорд╛рди рд╣реИ)ред
- рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ (GC) рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝реА рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВред
рдпрд╣ рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдХрд┐ рд╣реБрдб рдХреЗ рддрд╣рдд рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдФрд░ рдЪрд░рдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдереЛрдбрд╝реА рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдВ ред рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 500 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред
рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рдПрдВ
рдЗрд╕рд▓рд┐рдП, CLS рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдорд╛рдирд╡рддрд╛ рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реАрдПрд▓рдПрд╕ рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреБрдВрдЬреА traceID
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЗ рднреАрддрд░ рд╣рдореЗрдВ рдпрд╣ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдорд┐рд▓рддреА рд╣реИред
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдорд╛рди рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
const cls = require('cls-hooked') const uuidv4 = require('uuid/v4') const clsNamespace = cls.createNamespace('app') const clsMiddleware = (req, res, next) => {
рдФрд░ рд╣рдорд╛рд░реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдпрд╛ рд╕рд░реНрд╡рд┐рд╕ рдореЗрдВ, рд╣рдо рдЗрд╕ рдЯреНрд░реЗрд╕рдЖрдИрдбреА рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдХреЛрдб рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const controller = (req, res, next) => { const traceID = clsNamespace.get('traceID') }
рд╕рдЪ рд╣реИ, рд▓реЙрдЧ рдореЗрдВ рдЗрд╕ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛, рдпрд╣ рдЙрд╕рд╕реЗ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдмрд░реНрдл рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕реЗред
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рд╡рд┐рдВрд╕реНрдЯрди рдлреЙрд░реНрдореЗрдЯрд░ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
const { createLogger, format, transports } = require('winston') const addTraceId = printf((info) => { let message = info.message const traceID = clsNamespace.get('taceID') if (traceID) { message = `[TraceID: ${traceID}]: ${message}` } return message }) const logger = createLogger({ format: addTraceId, transports: [new transports.Console()], })
рдФрд░ рдЕрдЧрд░ рд╕рднреА рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╕реНрдЯрдо рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИрдВ), рддреЛ рдпрд╣ рд▓реЗрдЦ рд╢рд╛рдпрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рдЖрдк рдПрдбрд┐рдиреЛ рдХреЗ рд▓реЙрдЧ рдореЗрдВ рдПрдХ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?
рджреЛрд╕реНрддреЛрдВ рдХреЛ рдХреЛрдИ рднреА рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдФрд░ рд╕реАрдПрд▓рдПрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд░реЙрдХреНрд╕реА рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ
рдЦреБрдж рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж: рдпрд╣ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдореВрд▓ рд╡рд╕реНрддреБ рдХреЛ рд▓рдкреЗрдЯрддреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реАрдорд┐рдд рд╕реВрдЪреА рдореЗрдВ (рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ рдЙрдиреНрд╣реЗрдВ traps
рдХрд╣рд╛ рдЬрд╛рддрд╛ traps
)ред рдЖрдк рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЯреНрд░реИрдк рдЧреЗрдЯ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ ред рдпрд╣ рд╣рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЕрдЧрд░ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ const a = { prop: 1 }
рдФрд░ рдЗрд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рддреЛ рдЯреНрд░реИрдк рдХреА рдорджрдж рд╕реЗ рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо a.prop
рдХрд╣рддреЗ рд╣реИрдВред
pino
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ pino
рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдПрдХ рдкрд┐рдиреЛ рдмрдЪреНрдЪреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрд╕ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдмрдЪреНрдЪреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕реАрдПрд▓рдПрд╕ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдЬреЛ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рдмрдЪреНрдЪреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдпрджрд┐ рдХреЛрдИ рд╕рдХреНрд░рд┐рдп рд╕рдВрджрд░реНрдн рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдмрдЪреНрдЪрд╛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд╣реИ, рдпрд╛ рдореВрд▓ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЙрдХреНрд╕реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
const pino = require('pino') const logger = pino() const loggerCls = new Proxy(logger, { get(target, property, receiver) {
рд╣рдорд╛рд░рд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
const cls = require('cls-hooked') const uuidv4 = require('uuid/v4') const clsMiddleware = (req, res, next) => {
рдФрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const controller = (req, res, next) => { loggerCls.info('Long live rocknroll!')
рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ cls-proxify рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдХреЛрдЖ рдФрд░ рддреЗрдЬ рдХрд░рддреА рд╣реИ ред рдЬрд╛рд▓ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЬрд╛рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдо рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕, рдХреНрд▓рд╛рд╕реЗрд╕ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд┐рдиреЛ рдХреЛ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдкрд┐рдиреЛ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЛ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЙрдкрдпреЛрдЧреА рдерд╛ред рдХреГрдкрдпрд╛ рд▓рд╛рдд рдорд╛рд░реЗрдВ рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рдХрд░реЗрдВред рд╣рдо рдПрдХ рд╕рд╛рде рдмреЗрд╣рддрд░ рдХреЛрдб рдХрд░рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗред