рдЖрдкрдХрд╛ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ Node.js рдРрдк рдЖрд╕рд╛рди рд╣реИ

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

рдПрдХ рддрд▓рд╣рдЯреА рддреИрдпрд╛рд░ рдХрд░реЗрдВ


рддреЛ рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИ:

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

рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ


рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░

рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдкрдХреЛ рдХреБрдЫ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ (рдореЗрд░рд╛ рдирд╛рдо рд╣реИрдмреНрд░-рдиреЛрдбрдмреЙрдХреНрд╕) рдФрд░ рдкреИрдХреЗрдЬ: рдЬреЗрд╕рди рдлрд╝рд╛рдЗрд▓ рдЗрди:

{ "name": "habr-nodebox", "version": "0.0.1", "node": "0.6.17", "author": "andbas", "dependencies": { "express": "2.5.x", "jade": "0.26.x", "dbox": "0.4.x" } } 

рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо, рд╕рдВрд╕реНрдХрд░рдг, рд▓реЗрдЦрдХ - рдмрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдВ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдиреЛрдб - рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП Node.js рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг; рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреБрднрд╛рдЧ рд╕рднреА рдкреНрд░рдпреБрдХреНрдд рддреГрддреАрдп-рдкрдХреНрд╖ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдЬреЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреАред рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдкреНрд▓рдЧрдЗрди, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдирд╛рдордХ рдПрдХ рдЕрдиреНрдп рдкреНрд▓рдЧрдЗрди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рдкреБрд░рд╛рдиреЗ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ / рдЯреЛрдХрди рдерд╛ред рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП oauth рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдХреЙрд▓ рдХрд░реЗрдВ:

 npm install 

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

рдЗрд╕ рдмреАрдЪ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдореЗрдВ

рдЕрдЧрд░ рд╣рдо рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдореЗрдВ рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдФрд░ рдЧреБрдкреНрдд рд▓рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реЗ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдЦрд╛рддреЗ рдХреЗ рдЖрд╡реЗрджрди рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рдирдпрд╛ рдЖрд╡реЗрджрди рдмрдирд╛рдПрдВред рдПрдХреНрд╕реЗрд╕ рдкреНрд░рдХрд╛рд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ, рдРрдк рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рддрдХ рд╕реАрдорд┐рдд рдкрд╣реБрдВрдЪ рд╣реЛрдЧреА)ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреГрд╖реНрда рдкрд░, рд╣рдо рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдРрдк рдХреБрдВрдЬреА рдФрд░ рдРрдк рд╕реАрдХреНрд░реЗрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗред рдпрд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╣рд▓рд╛ рдХрджрдо рдкрд╣рд▓реЗ рд╣реА рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЗрдВ рдЕрдЧрд▓реЗ рдЪрд░рдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрд╕реА рдиреЛрдб рдкрд░ рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ (рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ dbox-init.js):

 var dbox = require("dbox"), stdin = process.stdin, stdout = process.stdout; ask('App key', /^\S+$/, function(app_key) { ask('App secret', /^\S+$/, function(app_secret) { var app = dbox.app({ 'app_key': app_key, 'app_secret': app_secret }); app.request_token(function(status, request_token){ if(request_token){ console.log('Please visit ', request_token.authorize_url, ' to authorize your app.'); ask('Is this done? (yes)', /^yes$/, function(answer) { app.access_token(request_token, function(status, access_token){ console.log('app_key: ' + app_key); console.log('app_secret: ' + app_secret); console.log('oauth_token: ' + access_token.oauth_token); console.log('oauth_token_secret: ' + access_token.oauth_token_secret); console.log('uid: ' + access_token.uid); process.exit(); }); }); } }); }); }); function ask(question, format, callback) { stdin.resume(); stdout.write(question + ": "); stdin.once('data', function(data) { data = data.toString().trim(); if (format.test(data)) { callback(data); } else { stdout.write("It should match: "+ format +"\n"); ask(question, format, callback); } }); } 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ:

 node dbox-init 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдореЗрдВ рдСрде рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЙрди рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪрд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

рдЗрд╕ рддреИрдпрд╛рд░реА рдХреЗ рдХрд╛рдо рдХреЛ рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдЦреБрдж рдЖрд╡реЗрджрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд▓рдбрд╝рд╛рдИ рдореЗрдВ: рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдлреЗрдВрдХ рджреЛ


рд╣рдо, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд - рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ: рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ, рдирдП рдЬреЛрдбрд╝реЗрдВ, рдореМрдЬреВрджрд╛ рд╡рд╛рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдореИрдВ рдкреАрдбрд╝рд╛ рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдФрд░ рддреБрд░рдВрдд рдХреЛрдб (web.js) рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ред

 var express = require('express'), app = express.createServer(express.logger()), fs = require('fs'), dropbox = require("dbox").app({"app_key": process.env['dbox_app_key'], "app_secret": process.env['dbox_app_secret'] }), client = dropbox.createClient({oauth_token_secret: process.env['dbox_oauth_token_secret'], oauth_token: process.env['dbox_oauth_token'], uid: process.env['dbox_uid']}); app.use(express.static(__dirname+'/public')); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.set('view options', { layout: false }); app.use(express.bodyParser()); app.get('/', function(req, res) { client.metadata(".", function(status, reply) { res.render('index', { content : reply }); }); }); app.get('/:path', function(req, res) { var path = req.params.path; client.get(path, function(status, reply, metadata){ res.send(reply); }); }); app.post('/', function(req, res) { var fileMeta = req.files['file-input']; if (fileMeta) { fs.readFile(fileMeta.path, function(err, data) { if (err) throw err; client.put(fileMeta.name, data, function(status, reply) { res.redirect('/'); }); }); } else { res.redirect('/'); } }); var port = process.env['app_port'] || 5000; app.listen(port, function() { console.log("Listening on " + port); }); 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

 var express = require('express'), app = express.createServer(express.logger()), fs = require('fs'), dropbox = require("dbox").app({"app_key": process.env['dbox_app_key'], "app_secret": process.env['dbox_app_secret'] }), client = dropbox.createClient({oauth_token_secret: process.env['dbox_oauth_token_secret'], oauth_token: process.env['dbox_oauth_token'], uid: process.env['dbox_uid']}); 

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рдореБрдЦреНрдп рдИрдВрдЯреЛрдВ рдХреА рдШреЛрд╖рдгрд╛:

 app.use(express.static(__dirname+'/public')); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.set('view options', { layout: false }); app.use(express.bodyParser()); 

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

 app.get('/', function(req, res) { client.metadata(".", function(status, reply) { res.render('index', { content : reply }); }); }); 

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

 app.get('/:path', function(req, res) { var path = req.params.path; client.get(path, function(status, reply, metadata){ res.send(reply); }); }); 

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

 app.post('/', function(req, res) { var fileMeta = req.files['file-input']; if (fileMeta) { fs.readFile(fileMeta.path, function(err, data) { if (err) throw err; client.put(fileMeta.name, data, function(status, reply) { res.redirect('/'); }); }); } else { res.redirect('/'); } }); 

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рдо рдПрдХреНрд╕рдкреНрд░реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдереЗред рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рднреЗрдЬреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рд╣реЗрдЬреА рдЧрдИ рдереАред рд╣рдореЗрдВ req.files ['рдлрд╛рдЗрд▓-рдЗрдирдкреБрдЯ'] рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдлрд╝рд╛рдЗрд▓-рдЗрдирдкреБрдЯ HTML рдореЗрдВ рдлреЙрд░реНрдо рдХреЗ рдЗрдирдкреБрдЯ рддрддреНрд╡ рдХрд╛ рдирд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд▓реЗрдиреЗ рдФрд░ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдкрд░ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдВрдЧреЗред

 var port = process.env['app_port'] || 5000; app.listen(port, function() { console.log("Listening on " + port); }); 

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 5000 рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЬреЗрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рдкреГрд╖реНрда рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдпрд╣ рдХрд░реЗрдВрдЧреЗред

рдЬреЗрдб рдЯреЗрдореНрдкрд▓реЗрдЯ - рдпрд╣ рд╕рдм рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ


рдЬреЗрдб рдХреЗ рд╕рд╛рде рдореЗрд░реА рдкрд╣рд▓реА рдореБрдарднреЗрдбрд╝ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рджрд░реНрджрдирд╛рдХ рдереАред рд╕рд╛рдорд╛рдиреНрдп html рдХрд┐рд╕реА рддрд░рд╣ рдХрд░реАрдм рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрд╕реБрд╡рд┐рдзрд╛ рдЬрд▓реНрджреА рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдИред рджреВрд╕рд░рд╛ рдкреЗрдЬ рдмрд┐рдирд╛ рд╢рддреНрд░реБрддрд╛ рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрджрдд рдЬрд▓реНрджреА рдкрдбрд╝ рдЬрд╛рддреА рд╣реИред рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдЬреЗрдб рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреГрд╢реНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ index.jade рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд▓рд┐рдЦреЗрдВ:

 !!! 5 html(lang="en") head title habr-nodebox body each item, i in content.contents div a(href="#{item.path}") #{item.path} - #{item.size} div form#upload-form(action="/", method="POST", enctype="multipart/form-data") input#file-input(name="file-input", type="file") input#submit(value="Upload file", type="submit") 

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

рд▓рд╛рдВрдЪ


рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рд╣реИ рдФрд░ рдпрд╣ рддреИрдпрд╛рд░ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдкрдврд╝рддреЗ рд╕рдордп рдХрд┐рд╕реА рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдХреА рд╕рднреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдПрдирд╡реА [] рдПрд░реЗред рдпрд╣ рдХреЛрдб рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдЫреЛрдбрд╝рдиреЗ рдФрд░ рд╕рдордЭреМрддрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдбрд░ рдХреЗ рдмрд┐рдирд╛ рдЖрд╡реЗрджрди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ process.env рд╕рд░рдгреА рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреЛрдб рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдХреБрдВрдЬреА = рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░, рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
 $ dbox_app_key=abc1qwe2rty3asd dbox_app_secret=123asd123asd123 dbox_oauth_token_secret=aaabbbccc111222 dbox_oauth_token=123asd123asd123 dbox_uid=12345678 node web 

Nodester рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдкрд░, process.env рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдерд╛ред
рдкрд░рд┐рдгрд╛рдо, рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦреЗрдЧрд╛ред


рдпрд╣ рд╕рдм рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдСрдирд▓рд╛рдЗрди рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ - рдмрд╕ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА Node.js рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред рдореИрдВрдиреЗ рдиреЛрдбрд╕реНрдЯрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ - рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд┐рдпрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдХреА рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдпрд╣рд╛рдВ рдХреЛрдб рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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


All Articles