ExpressJS рдкрд░ рдПрдХ рдкреВрд░реНрдг MVC рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг

NB: рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЖрдзрд╛рд░ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдмрд▓реНрд▓реЗ рд╕реЗ рд╕рд╣реА - рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдбреБрдмрдХреА рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдХреЛрдИ рдХрдЯреМрддреА рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдХреЛрдбрд┐рдВрдЧред рдпрджрд┐ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рд╢рд░реНрдореАрд▓реА рдордд рдмрдиреЛ, рд╣рдо рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред


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

рдЕрдиреБрд╡рд╛рдж


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

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


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

var connect = require('connect'), http = require('http'); var app = connect() .use(function(req, res, next) { console.log("That's my first middleware"); next(); }) .use(function(req, res, next) { console.log("That's my second middleware"); next(); }) .use(function(req, res, next) { console.log("end"); res.end("hello world"); }); http.createServer(app).listen(3000); 

рдорд┐рдбрд▓рд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдЧрд▓реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рддрдп рдХрд░рддрд╛ рд╣реИ: рдпрд╛ рддреЛ рдПрдХ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ, рдпрд╛ рдЕрдЧрд▓реЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдкрд╛рд╕ рдХрд░реЗрдВред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рдЖрдк рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдЧрд▓реА () рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрднреА рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХрдИ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдорд┐рдбрд▓рд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдЖрдкрдХреЛ рдПрдХ рдЯрди рд╕рдордп рдмрдЪрд╛рдПрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмреЙрдбреА рдкрд╛рд░реНрд╕рд░ рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдЬрд╕рди , рдПрдкреНрд▓рд┐рдХреЗрд╢рди / x-www-form-urlencoded рдФрд░ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ / рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ ред рдпрд╛ рдХреБрдХреА рдкрд╛рд░реНрд╕рд░ рдЬреЛ рдХреБрдХреА рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде req.cookies рдлрд╝реАрд▓реНрдб рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдХреБрдВрдЬреА рдХреБрдХреА рдХрд╛ рдирд╛рдо рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЦреБрдж рдХреЛ рдХрдиреЗрдХреНрдЯ рдлреНрд░реЗрдо рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд░реНрдХ рдХреЛ рдкрд╛рд░ рдХрд░рдирд╛, рдЬреЛ рд░реВрдЯрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд┐рдХрдиреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд GET рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 app.get('/hello.txt', function(req, res){ var body = 'Hello World'; res.setHeader('Content-Type', 'text/plain'); res.setHeader('Content-Length', body.length); res.end(body); }); 


рд╕реНрдерд╛рдкрдирд╛


рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ.рдЬреЙрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдкрдирд╛ рд╡рд┐рд╡рд░рдг рд░рдЦреЗрдВ рдФрд░ рдПрдирдкреАрдПрдо рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (рдРрд╕рд╛ рдордЬрд╝рд╛рдХ рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдирд╛рдо "рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ" :) рдХреЗ рд▓рд┐рдП рд╣реИ)ред

 { "name": "MyWebSite", "description": "My website", "version": "0.0.1", "dependencies": { "express": "3.x" } } 

рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рдХреЛ рдиреЛрдб_рдореЙрдбрд▓реНрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред рдореИрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ: рдХрдорд╛рдВрдб рд▓рд╛рдЗрдиред рдмрд╕ npm рд╕реНрдерд╛рдкрд┐рдд -g рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЪрд▓рд╛рдХрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдирдпрд╛ рд╕реАрдПрд▓рдЖрдИ рдЙрдкрдХрд░рдг рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:

 express --sessions --css less --hogan app 

рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреА рд╕реВрдЪреА рд╣реИ (1) рдХрдорд╛рдВрдб рд╡рд┐рдХрд▓реНрдк:

 Usage: express [options] Options: -h, --help output usage information -V, --version output the version number -s, --sessions add session support -e, --ejs add ejs engine support (defaults to jade) -J, --jshtml add jshtml engine support (defaults to jade) -H, --hogan add hogan.js engine support -c, --css add stylesheet support (less|stylus) (defaults to plain css) -f, --force force on non-empty directory 

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

 /public /images /javascripts /stylesheets /routes /index.js /user.js /views /index.hjs /app.js /package.json 

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

FastDelivery


рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ FastDelivery рдирд╛рдордХ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдмрдирд╛рдИред рдпрд╣рд╛рдБ рддреИрдпрд╛рд░ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ:


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

 /public /images (there are several images exported from Photoshop) /javascripts /stylesheets /home.less /inner.less /style.css /style.less (imports home.less and inner.less) /routes /index.js /views /index.hjs (home page) /inner.hjs (template for every other page of the site) /app.js /package.json 

рдпрд╣рд╛рдВ рдЙрди рд╕рд╛рдЗрдЯ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдкреНрд░рд╢рд╛рд╕рд┐рдд рдХрд░ рдкрд╛рдПрдВрдЧреЗ:

рд╡рд┐рдиреНрдпрд╛рд╕


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

 var config = { local: { mode: 'local', port: 3000 }, staging: { mode: 'staging', port: 4000 }, production: { mode: 'production', port: 5000 } } module.exports = function(mode) { return config[mode || process.argv[2] || 'local'] || config.local; } 

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

 ... var config = require('./config')(); ... http.createServer(app).listen(config.port, function(){ console.log('Express server listening on port ' + config.port); }); 

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

 node app.js staging 

рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛:

 Express server listening on port 4000 

рдЕрдм рд╣рдорд╛рд░реА рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдкрд░реАрдХреНрд╖рдг


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

 npm install -g jasmine-node 

рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рд╣рдорд╛рд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд╛рдо .spec.js рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ config.spec.js рдХрд╣реЗрдВрдЧреЗред

 describe("Configuration setup", function() { it("should load local configurations", function(next) { var config = require('../config')(); expect(config.mode).toBe('local'); next(); }); it("should load staging configurations", function(next) { var config = require('../config')('staging'); expect(config.mode).toBe('staging'); next(); }); it("should load production configurations", function(next) { var config = require('../config')('production'); expect(config.mode).toBe('production'); next(); }); }); 

рдЪрдореЗрд▓реА-рдиреЛрдб / .tests рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ рдФрд░ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:

 Finished in 0.008 seconds 3 tests, 6 assertions, 0 failures, 0 skipped 

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

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

рдореИрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

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

рдбреЗрдЯрд╛рдмреЗрд╕


рдпрджрд┐ рд╣рдо рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдореЛрдВрдЧреЛрдбрдм рдХреЛ рдЪреБрдирд╛ред Mongo рдПрдХ NoSQL рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИред рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд┐рд░реНрджреЗрд╢ рдорд┐рд▓реЗрдВрдЧреЗ, рдФрд░ рдЬрдм рд╕реЗ рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, MongoDB рдбреЗрдорди рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреЛрд░реНрдЯ 27017 рдкрд░ рд╕реБрдирддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкреЛрд░реНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдореИрдиреНрдЧреЛрдбрдм рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдиреЛрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдореЛрдВрдЧреЛрдбрдм рдореЙрдбреНрдпреВрд▓ / рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдкреИрдХреЗрдЬ.рдЬреЙрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдмрд╕ "mongodb" рдЬреЛрдбрд╝реЗрдВ: "1.3.10" рдирд┐рд░реНрднрд░рддрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдФрд░ npm рд╕реНрдерд╛рдкрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдореЛрдВрдЧреЛрдбрдм рд╕рд░реНрд╡рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдлрд╝рд╛рдЗрд▓ /tests/mongodb.spec.js:

 describe("MongoDB", function() { it("is there a server running", function(next) { var MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://127.0.0.1:27017/fastdelivery', function(err, db) { expect(err).toBe(null); next(); }); }); }); 

рдореЛрдВрдЧреЙрдбрдм рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди .connect рдПрдХ db рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ MongoClient рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛:

 MongoClient.connect('mongodb://127.0.0.1:27017/fastdelivery', function(err, db) { if(err) { console.log('Sorry, there is no mongo db server running.'); } else { var attachDB = function(req, res, next) { req.db = db; next(); }; http.createServer(app).listen(config.port, function(){ console.log('Express server listening on port ' + config.port); }); } }); 

рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдореЛрдВрдЧреЛрдбрдм рд╕рд░реНрд╡рд░ рдХреЗ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдФрд░ рдкреЛрд░реНрдЯ рдХреЛ рд░рдЦрдирд╛ рдФрд░ рдХрдиреЗрдХреНрд╢рди URL рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛:

'рдореЛрдВрдЧреЛрдбрдм: //' + config.mongo.host + ':' + config.mongo.port + '/ fastpelija'

рдорд┐рдбрд┐рд▓рд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдЕрдЯреИрдЪрдореЗрдВрдЯ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ , рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ http.createServer рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рдерд╛ред рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА .db рд╕рдВрдкрддреНрддрд┐ рдХреЛ рднрд░ рджреЗрдВрдЧреЗред рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдорд╛рд░реНрдЧ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рджреМрд░рд╛рди рдХрдИ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 app.get('/', attachDB, function(req, res, next) { ... }) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЕрдиреБрд▓рдЧреНрдирдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╛рд░реНрдЧ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣реЛ рдЬрд╛рдПред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ .db рдЧреБрдг рд╣реЛрдЧрд╛ рдФрд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

MVC


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

рдЖрджрд░реНрд╢

рдПрдХ рдореЙрдбрд▓ рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ред рдпрд╣ MongoClient рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП db рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдБрдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ BlogModel рдпрд╛ ContactsModel рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛: /tests/base.model.spec.js ред рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ: рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрдирд╛рдХрд░, рд╣рдо рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗрд╡рд▓ рд╡рд╣реА рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдирд╣реАрдВред

 var Model = require("../models/Base"), dbMockup = {}; describe("Models", function() { it("should create a new model", function(next) { var model = new Model(dbMockup); expect(model.db).toBeDefined(); expect(model.extend).toBeDefined(); next(); }); it("should be extendable", function(next) { var model = new Model(dbMockup); var OtherTypeOfModel = model.extend({ myCustomModelMethod: function() { } }); var model2 = new OtherTypeOfModel(dbMockup); expect(model2.db).toBeDefined(); expect(model2.myCustomModelMethod).toBeDefined(); next(); }) }); 

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

 module.exports = function(db) { this.db = db; }; module.exports.prototype = { extend: function(properties) { var Child = module.exports; Child.prototype = module.exports.prototype; for(var key in properties) { Child.prototype[key] = properties[key]; } return Child; }, setDB: function(db) { this.db = db; }, collection: function() { if(this._collection) return this._collection; return this._collection = this.db.collection('fastdelivery-content'); } } 

рджреЛ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдбреАрдмреА рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЧреЗрдЯреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░ред

рд╡рд┐рдЪрд╛рд░

рджреГрд╢реНрдп рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рджреГрд╢реНрдп рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддрд╛ рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

 res.render('index', { title: 'Express' }); 

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

 app.set('views', __dirname + '/templates'); 

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


рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдореБрдЭреЗ рдкреНрд░рд╕реНрддреБрддрд┐ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА? рдХреНрдпрд╛ рд╡рд╣ рд╕рд┐рд░реНрдл response.render рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ? рдЦреИрд░, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рд╣реЗрдбрд░ рднреЗрдЬрдиреЗ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдореЗрдВ рдЖрдП рдкреНрд░реЛрд╕реЗрд╕ рдбреЗрдЯрд╛:

 var data = {"developer": "Krasimir Tsonev"}; response.contentType('application/json'); response.send(JSON.stringify(data)); 

рд╣рд░ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, HTMLView рдФрд░ JSONView рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╛ XML рдбреЗрдЯрд╛ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ XML рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧред рдпрджрд┐ рдЖрдк рдПрдХ рдмрдбрд╝рд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдХреЛрдб рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реЛрдЧреАред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд / рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ / Base.js рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рд╣реИ:

 var View = require("../views/Base"); describe("Base view", function() { it("create and render new view", function(next) { var responseMockup = { render: function(template, data) { expect(data.myProperty).toBe('value'); expect(template).toBe('template-file'); next(); } } var v = new View(responseMockup, 'template-file'); v.render({myProperty: 'value'}); }); it("should be extendable", function(next) { var v = new View(); var OtherView = v.extend({ render: function(data) { expect(data.prop).toBe('yes'); next(); } }); var otherViewInstance = new OtherView(); expect(otherViewInstance.render).toBeDefined(); otherViewInstance.render({prop: 'yes'}); }); }); 

рд░реЗрдВрдбрд░рд┐рдВрдЧ (рджреГрд╢реНрдп) рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рдирд╛ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╕реНрддреБ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдпрд╛, рдЬреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреА рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдХрдХреНрд╖рд╛ рдХреЛрдб / рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ / Base.js :

 module.exports = function(response, template) { this.response = response; this.template = template; }; module.exports.prototype = { extend: function(properties) { var Child = module.exports; Child.prototype = module.exports.prototype; for(var key in properties) { Child.prototype[key] = properties[key]; } return Child; }, render: function(data) { if(this.response && this.template) { this.response.render(this.template, data); } } } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рддреАрди рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЪрдореЗрд▓реА-рдиреЛрдб / .tests рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ , рддреЛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 Finished in 0.009 seconds 7 tests, 18 assertions, 0 failures, 0 skipped 

рдирд┐рдпрдВрддреНрд░рдХ

рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдордиреЗ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рдФрд░ рд╡реЗ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ?

 app.get('/', routes.index); 

рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдорд╛рд░реНрдЧ рдХреЗ рдмрд╛рдж рдХрд╛ рдкреНрд░рддреАрдХ '/' рдирд┐рдпрдВрддреНрд░рдХ рд╣реИред рдпрд╣ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдз , рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрдЧрд▓реЗ () рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред

 exports.index = function(req, res, next) { res.render('index', { title: 'Express' }); }; 

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

рдмрд╕ рдХреБрдЫ рдмрд┐рдВрджреБ, рд▓реЗрдХрд┐рди рд╣рдо рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░реАрдХреНрд╖рд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

 var BaseController = require("../controllers/Base"); describe("Base controller", function() { it("should have a method extend which returns a child instance", function(next) { expect(BaseController.extend).toBeDefined(); var child = BaseController.extend({ name: "my child controller" }); expect(child.run).toBeDefined(); expect(child.name).toBe("my child controller"); next(); }); it("should be able to create different childs", function(next) { var childA = BaseController.extend({ name: "child A", customProperty: 'value' }); var childB = BaseController.extend({ name: "child B" }); expect(childA.name).not.toBe(childB.name); expect(childB.customProperty).not.toBeDefined(); next(); }); }); 

рдФрд░ рдиреАрдЪреЗ /controllers/Base.js рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

 var _ = require("underscore"); module.exports = { name: "base", extend: function(child) { return _.extend({}, this, child); }, run: function(req, res, next) { } } 

рдмреЗрд╢рдХ, рдкреНрд░рддреНрдпреЗрдХ рд╡рдВрд╢рдЬ рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░рди рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

FastDelivery рд╡реЗрдмрд╕рд╛рдЗрдЯ


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

рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖

рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рдПрдВ рдЬреЛ рдПрдбрдорд┐рди рдкреИрдирд▓ рдкреЗрдЬ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдлрд╝рд╛рдЗрд▓ / рдирд┐рдпрдВрддреНрд░рдХ / рд╡рд┐рдЬреНрдЮрд╛рдкрди рдкреНрд░рдмрдВрдзрдХ :

 var BaseController = require("./Base"), View = require("../views/Base"); module.exports = BaseController.extend({ name: "Admin", run: function(req, res, next) { var v = new View(res, 'admin'); v.render({ title: 'Administration', content: 'Welcome to the control panel' }); } }); 

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

 <!DOCTYPE html> <html> <head> <title>{{ title }}</title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <div class="container"> <h1>{{ content }}</h1> </div> </body> </html> 

(рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк GitHub рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред)
рдЕрдм, рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдРрдк рдореЗрдВ рдПрдХ рдорд╛рд░реНрдЧ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред .js :

 var Admin = require('./controllers/Admin'); ... var attachDB = function(req, res, next) { req.db = db; next(); }; ... app.all('/admin*', attachDB, function(req, res, next) { Admin.run(req, res, next); }); 

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╣рдо Admin.run рдкрджреНрдзрддрд┐ рдХреЛ рд╕реАрдзреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рднреЗрдЬрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:

 app.all('/admin*', Admin.run); 

рдХреЗ рд╢рдмреНрдж рдЗрд╕ рд╡рд╕реНрддреБ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЬрдЧрд╣ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рд╕рдВрд░рдХреНрд╖рдг

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛:

 authorize: function(req) { return ( req.session && req.session.fastdelivery && req.session.fastdelivery === true ) || ( req.body && req.body.username === this.username && req.body.password === this.password ); } 

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

 run: function(req, res, next) { if(this.authorize(req)) { req.session.fastdelivery = true; req.session.save(function(err) { var v = new View(res, 'admin'); v.render({ title: 'Administration', content: 'Welcome to the control panel' }); }); } else { var v = new View(res, 'admin-login'); v.render({ title: 'Please login' }); } } 


рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдмрдВрдзрди

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

 // /models/ContentModel.js var Model = require("./Base"), crypto = require("crypto"), model = new Model(); var ContentModel = model.extend({ insert: function(data, callback) { data.ID = crypto.randomBytes(20).toString('hex'); this.collection().insert(data, {}, callback || function(){ }); }, update: function(data, callback) { this.collection().update({ID: data.ID}, data, {}, callback || function(){ }); }, getlist: function(callback, query) { this.collection().find(query || {}).toArray(callback); }, remove: function(ID, callback) { this.collection().findAndModify({ID: ID}, [], {}, {remove: true}, callback); } }); module.exports = ContentModel; 

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

 var model = new (require("../models/ContentModel")); model.insert({ title: "Contacts", text: "...", type: "contacts" }); 

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

рдПрдХ рдкреГрд╖реНрда рдкрд░ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрд╕ рдбреЗрдЯрд╛ рдкрд░ рдЬреЛ рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрдИ рдПрдХреАрдХреГрдд рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдмрдирд╛рдП, рдЬреИрд╕реЗ рдХрд┐:

 var self = this; ... var v = new View(res, 'admin'); self.del(req, function() { self.form(req, res, function(formMarkup) { self.list(function(listMarkup) { v.render({ title: 'Administration', content: 'Welcome to the control panel', list: listMarkup, form: formMarkup }); }); }); }); 

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

 handleFileUpload: function(req) { if(!req.files || !req.files.picture || !req.files.picture.name) { return req.body.currentPicture || ''; } var data = fs.readFileSync(req.files.picture.path); var fileName = req.files.picture.name; var uid = crypto.randomBytes(10).toString('hex'); var dir = __dirname + "/../public/uploads/" + uid; fs.mkdirSync(dir, '0777'); fs.writeFileSync(dir + "/" + fileName, data); return '/uploads/' + uid + "/" + fileName; } 

рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА .files рд╕рдВрдкрддреНрддрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рднрд░реА рдЬрд╛рдПрдЧреАред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди HTML рддрддреНрд╡ рд╣реИрдВ:

 <input type="file" name="picture" /> 

рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рднреЗрдЬреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ req.files.picture рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, req.files.picture.path рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ рдХреА рдХрдЪреНрдЪреА (рдХрдЪреНрдЪреА) рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднреЗрдЬреЗ рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рд╣реА рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рдВрдмрдВрдзрд┐рдд URL рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред рдпреЗ рд╕рднреА рдСрдкрд░реЗрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд░реАрдбрдлрд╛рдЗрд▓рд╕рдВрдХ , mkdirSync рдФрд░ рд░рд╛рдЗрдЯрдлрд╛рдЗрд▓рд╕рдВрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднрд╛рдЧ

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

 module.exports = BaseController.extend({ name: "Home", content: null, run: function(req, res, next) { model.setDB(req.db); var self = this; this.getContent(function() { var v = new View(res, 'home'); v.render(self.content); }) }, getContent: function(callback) { var self = this; this.content = {}; model.getlist(function(err, records) { ... storing data to content object model.getlist(function(err, records) { ... storing data to content object callback(); }, { type: 'blog' }); }, { type: 'home' }); } }); 

рд╣реЛрдо рдкреЗрдЬ рдХреЛ "рд╣реЛрдо" рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдФрд░ "рдмреНрд▓реЙрдЧ" рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЪрд╛рд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдПрдХ рдмрд╛рд░ рдЬрдм рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рдореЗрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА app.js :

 app.all('/', attachDB, function(req, res, next) { Home.run(req, res, next); }); 

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

 app.all('/blog/:id', attachDB, function(req, res, next) { Blog.runArticle(req, res, next); }); app.all('/blog', attachDB, function(req, res, next) { Blog.run(req, res, next); }); 

рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рдмреНрд▓реЙрдЧ , рд▓реЗрдХрд┐рди рд╡реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ ред рд▓рд╛рдЗрди / рдмреНрд▓реЙрдЧ /: рдЖрдИрдбреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ ред рдпрд╣ рдорд╛рд░реНрдЧ URL рдЬреИрд╕реЗ: / рдмреНрд▓реЙрдЧ / 4e3455635b4a6f6dccfaa1e50ee71f1cde75222b рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ , рдЬрд╣рд╛рдВ рдпрд╣ рд▓рдВрдмреА рд╣реИрд╢ req.params.id рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдЧреА ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдЧрддрд┐рд╢реАрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ (рд▓реЗрдЦ) рдХреА рдЖрдИрдбреА рд╣реЛрдЧреАред рдЕрдм рдЬрдм рд╣рдордиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреЛрдЦрд╛ рдкреЗрдЬ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рджреВрд╕рд░рд╛ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╕реЗрд╡рд╛рдУрдВ, рдХрд░рд┐рдпрд░ рдФрд░ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ рдкреЗрдЬ рдХреИрд╕реЗ рдмрдирд╛рдКрдВрдЧрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡реЗ рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдЙрд╕реА рдХреЛрдб рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдЯрд╛рдЗрдк рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓реЗрдВрдЧреЗ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ, рдПрдХ рдПрдХрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛ рдЕрдкрдиреА рд░рди рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ ред рдпреЗ рдорд╛рд░реНрдЧ рд╣реИрдВ:

 app.all('/services', attachDB, function(req, res, next) { Page.run('services', req, res, next); }); app.all('/careers', attachDB, function(req, res, next) { Page.run('careers', req, res, next); }); app.all('/contacts', attachDB, function(req, res, next) { Page.run('contacts', req, res, next); }); 

рдФрд░ рдпрд╣рд╛рдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:

 module.exports = BaseController.extend({ name: "Page", content: null, run: function(type, req, res, next) { model.setDB(req.db); var self = this; this.getContent(type, function() { var v = new View(res, 'inner'); v.render(self.content); }); }, getContent: function(type, callback) { var self = this; this.content = {} model.getlist(function(err, records) { if(records.length > 0) { self.content = records[0]; } callback(); }, { type: type }); } }); 


рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд


рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рддреИрдирд╛рддреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ Node.js рдкрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ:

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

 forever start yourapp.js 

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

 127.0.0.1 expresscompletewebsite.dev 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ Apache рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд httpd-vhosts.conf рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:

 # expresscompletewebsite.dev <VirtualHost *:80> ServerName expresscompletewebsite.dev ServerAlias www.expresscompletewebsite.dev ProxyRequests off <Proxy *> Order deny,allow Allow from all </Proxy> <Location /> ProxyPass http://localhost:3000/ ProxyPassReverse http://localhost:3000/ </Location> </VirtualHost> 


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

 server { listen 80; server_name expresscompletewebsite.dev location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $http_host; } } 


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

рдирд┐рд╖реНрдХрд░реНрд╖


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

рд╕реНрд░реЛрдд рдХреЛрдб

GitHub рдкрд░ рд╣рдордиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЬреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдмрдирд╛рдИ рд╣реИ, рдЙрд╕рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб https://github.com/tutsplus/build-complete-website-expressjs рд╣реИ ред рдХрд╛рдВрдЯрд╛ рдФрд░ рдЙрдиреНрдирдпрди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрджрдо рджрд░ рдХрджрдо рдЧрд╛рдЗрдб рд╣реИ:

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


All Articles