NodeJS рд▓реЙрдЧрд┐рдВрдЧ рд╕рд╣реА рдХрд┐рдпрд╛


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


NodeJS рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рд╣реЛрдирд╛ рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ?


рдЦреИрд░, рдЙрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЬреЛ рдорд▓реНрдЯреА-рдереНрд░реЗрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рд╕реНрдкреЙрди рдХрд░рддреЗ рд╣реИрдВред рдереНрд░реЗрдб-рд▓реЛрдХрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдЙрд░реНрдл тАЛтАЛрдЯреАрдПрд▓рдПрд╕ рдирд╛рдордХ рдПрдХ рдЪреАрдЬ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рдордирдорд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдЙрдкрд▓рдмреНрдз рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрд╢реА рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрдИрдбреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рддреБрдЪреНрдЫ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЯреАрдПрд▓рдПрд╕ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ рдпрд╛ рд╕реЗрд╡рд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рддреЛ рдХреНрдпрд╛ NodeJS рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рд╣реИ?
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, NodeJS рдПрдХ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рд╢реНрд░рдорд┐рдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрдбрд╝реА рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ) рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо, рдЬреЛ рдЯреАрдПрд▓рдПрд╕ рдХреЛ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдмрдирд╛рддрд╛ рд╣реИред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп NodeJS рдПрдХ рд╣реА рдереНрд░реЗрдб рдХреЗ рднреАрддрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓рдмреИрдХ рдЪрд▓рд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ NodeJS рдореЗрдВ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ ) рдФрд░ NodeJS рд╣рдореЗрдВ рдЗрди рдХреЙрд▓рдмреИрдХ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ ред


рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ (v0.11.11) рд╣рдорд╛рд░реЗ рдкрд╛рд╕ addAsyncListener рдерд╛ рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлреЙрд░реЗрд╕реНрдЯ рдиреЙрд░рд╡реЗрд▓ рдиреЗ рдирд┐рд░рдВрддрд░ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдЙрд░реНрдл тАЛтАЛрд╕реАрдПрд▓рдПрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ред рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕реАрдПрд▓рдПрд╕ рдХреЗ рдЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА v0.12 рдореЗрдВ рдЙрд╕ рдПрдкреАрдЖрдИ рд╕реЗ рдЫреАрди рд▓рд┐рдП рдЧрдП рдереЗред


NodeJS 8 рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ NodeJS 'async рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рддрдХ рд╣реБрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ NodeJS 8 рдиреЗ рд╣рдореЗрдВ async_hooks рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдИ рд╣реБрдИ рд╢рдХреНрддрд┐ рдкреНрд░рджрд╛рди рдХреА (рдпрджрд┐ рдЖрдк async_hooks рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ)ред рдпрд╣ рд╣рдореЗрдВ CLS - cls-hooked рдХреЗ рдЖрдзреБрдирд┐рдХ async_hooks- рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИред


рд╕реАрдПрд▓рдПрд╕ рдЕрд╡рд▓реЛрдХрди


рд╕реАрдПрд▓рдПрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдкреНрд░рд╡рд╛рд╣ рд╣реИ:



рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рддреЛрдбрд╝рддреЗ рд╣реИрдВ:


  1. рдХрд╣рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реИред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрдХ CLS рдирд╛рдо рд╕реНрдерд╛рди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд▓рд┐рдПред
  2. рджреВрд╕рд░рд╛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕реАрдПрд▓рдПрд╕ рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕рд┐рд░реНрдл рдПрдХ рдХреЙрд▓рдмреИрдХ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. рдЗрд╕рд▓рд┐рдП рдЬрдм рдХреЛрдИ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдЖрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред
  4. рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╣рдо рдПрдХ рдирдпрд╛ рд╕реАрдПрд▓рдПрд╕ рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╣реИрдВ (рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рддрд░реАрдХрд╛ рд░рди рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ)ред
  5. рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕реАрдПрд▓рдПрд╕ рдирдП рд╕рдВрджрд░реНрдн рдХреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред
  6. рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдПрд▓рдПрд╕ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ active рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕реАрдПрд▓рдПрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП active рд╣реЛрддрд╛ рд╣реИред
  7. рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдВрджрд░ рд╣рдо рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
  8. init async рд╣реБрдХ рдХреЛ рдирдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЛ async рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЗрд╕реЗ рдирдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдорд╛рдиреЗрдВ)ред
  9. рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рдФрд░ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
  10. Async рд╣реБрдХ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рд╕рдХреНрд░рд┐рдп рд╕рдВрджрд░реНрдн рдХреЛ undefined (рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдЪ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдЪ рд╣реИ)ред
  11. рдирд╖реНрдЯ рд╣реБрдХ рдкрд╣рд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрджрд░реНрдн рдХреЗ рдирдХреНрд╢реЗ рдХреЛ рдЗрд╕рдХреА async рдЖрдИрдбреА рд╕реЗ рд╣рдЯрд╛рддрд╛ рд╣реИ (рдпрд╣ рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдХреЙрд▓рдмреИрдХ рдХреА рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рдХреЗ рд╕рдорд╛рди рд╣реИ)ред
  12. рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░рд╛ рджреВрд╕рд░рд╛ рдХреЙрд▓рдмреИрдХ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
  13. рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣рд▓реЗ async рд╣реБрдХ рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рджреВрд╕рд░реЗ рдСрдкрд░реЗрд╢рди (рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрдиреБрд░реЛрдз) рдХреА рд╕рдорд╛рди рдЖрдИрдбреА рд╣реИред рдпрд╣ рдирд╛рдорд╕реНрдерд╛рди рдХреА active рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЙрд╕рдХреЗ рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ active ред рдпрд╣ рд╡рд╣ рд╕рдВрджрд░реНрдн рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛ред
  14. рдЕрдм рд╣рдо рдЕрдкрдирд╛ рджреВрд╕рд░рд╛ рдХреЙрд▓рдмреИрдХ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЕрдВрджрд░ рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдЪрд▓рд╛рдПрдВред рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╣рдо рд╕реАрдПрд▓рдПрд╕ рд╕реЗ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдЬреЛ рдХреБрдЫ рднреА рдкрд╛рддрд╛ рд╣реИ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
  15. рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдВрдд рд╣реИред
  16. Async рд╣реБрдХ рдХреЗ рдмрд╛рдж рджреВрд╕рд░реА рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рд╕рдХреНрд░рд┐рдп рд╕рдВрджрд░реНрдн рдХреЛ undefined ред
  17. destroy рд╣реБрдХ рджреВрд╕рд░реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЗрд╕рдХреА async рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред
  18. рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЕрдм рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБ рдкрд░ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реА рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдлрд┐рд░ рднреА рдЗрд╕рдореЗрдВ рд╕рднреА рдкреНрд░рдореБрдЦ рдХрджрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ 500 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдХрдо рд╣реИред


рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдмрдирд╛рдирд╛


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


рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:


 const cls = require('cls-hooked') const uuidv4 = require('uuid/v4') const clsNamespace = cls.createNamespace('app') const clsMiddleware = (req, res, next) => { // req and res are event emitters. We want to access CLS context inside of their event callbacks clsNamespace.bind(req) clsNamespace.bind(res) const traceID = uuidv4() clsNamespace.run(() => { clsNamespace.set('traceID', traceID) 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()], }) 

рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╕рднреА рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдлрд╝рд╛рд░реНрдореЗрдЯрд░реЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП) рдпрд╣ рд▓реЗрдЦ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рдХреЛрдИ рдореЗрд░реЗ рдкреНрд░рд┐рдп рдкрд┐рдиреЛ рдореЗрдВ рдЯреНрд░реЗрд╕ рдЖрдИрдбреА рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдЧрд╛? рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА !


рдкреНрд░реЙрдХреНрд╕реА рдФрд░ рд╕реАрдПрд▓рдПрд╕ рдХрд╛ рд╕рдВрдпреЛрдЬрди


рдкреНрд░реЙрдХреНрд╕реА рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдореВрд▓ рд╡рд╕реНрддреБ рдХреЛ рд▓рдкреЗрдЯрддреА рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЦрддреНрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА (рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рдЖрдк рдпрд╣рд╛рдВ рдкреВрд░реЗ рд╕реЗрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдЬрд╛рд▓ рдкрд╛рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ ред рдпрд╣ рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдореЗрдВ рдЕрд╡рд░реЛрдзрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ const a = { prop: 1 } рдФрд░ рдЗрд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рд░реИрдк рдХрд░реЗрдВ, get рдЯреНрд░реИрдк рдХреЗ рд╕рд╛рде рд╣рдо рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо a.prop рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реИрдВред


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


рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкреНрд░реЙрдХреНрд╕реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:


 const pino = require('pino') const logger = pino() const loggerCls = new Proxy(logger, { get(target, property, receiver) { // Fallback to our original logger if there is no child logger in CLS target = clsNamespace.get('loggerCls') || target return Reflect.get(target, property, receiver) }, }) 

рд╣рдорд╛рд░рд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:


 const cls = require('cls-hooked') const uuidv4 = require('uuid/v4') const clsMiddleware = (req, res, next) => { // req and res are event emitters. We want to access CLS context inside of their event callbacks clsNamespace.bind(req) clsNamespace.bind(res) const traceID = uuidv4() const loggerWithTraceId = logger.child({ traceID }) clsNamespace.run(() => { clsNamespace.set('loggerCls', loggerWithTraceId) next() }) } 

рдФрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 const controller = (req, res, next) => { loggerCls.info('Long live rocknroll!') // Logs something like // {"level":30,"time":1551385666046,"msg":"Long live rocknroll!","pid":25,"hostname":"eb6a6c70f5c4","traceID":"9ba393f0-ec8c-4396-8092-b7e4b6f375b5","v":1} } 

рд╕реАрдПрд▓рдПрд╕-Proxify


рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдКрдкрд░ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЬрд┐рд╕реЗ cls-proxify рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ , рдХреЛрдЖ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рд╣реИ рдФрд░ рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ рдХреЛ рддреЗрдЬ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рди рдХреЗрд╡рд▓ рдореВрд▓ рд╡рд╕реНрддреБ рдХреЛ рдЬрд╛рд▓ get , рдмрд▓реНрдХрд┐ рдХрдИ рдЕрдиреНрдп рднреАред рддреЛ рдЕрдирдВрдд рд╕рдВрднрд╡ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВред рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдХрдХреНрд╖рд╛ рдирд┐рд░реНрдорд╛рдг, рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЖрдк рдХреЗрд╡рд▓ рдЕрдкрдиреА рдХрд▓реНрдкрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИрдВ!
рдкреАрдиреЛ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рдкреАрдиреЛ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЛ рддреЗрдЬ рдХрд░реЗрдВ ред


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

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


All Articles