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

реи.реи рдбреЗрдореЛ рдЖрд╡реЗрджрди
рдпрд╣ рд╣рдорд╛рд░реЗ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдкрд╣рд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рд▓рд┐рдЦреАред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ "рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб" рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
$ cd ~/projects/node-tutorial $ mkdir node-demo-app $ cd node-demo-app
2.2.1 рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ
Npm рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдПрдХ рдиреЛрдб рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓реЗрдЦрдХ рдЗрд╕ рдкрд░
рд╡рд┐рд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ)ред рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, npm рдкреИрдХреЗрдЬ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ package.json рдлрд╛рдЗрд▓ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдЖрдк рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рд╕ рджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ,
package.json рдХрд╛
рд╡рд┐рд╡рд░рдг рдкрдврд╝реЗрдВред
Npm рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЖрдХрд░реНрд╖рдг рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ:
$ touch package.json
package.json:
{ "name": "node-demo-app" , "version": "0.0.1" , "scripts": { "start": "node server.js" } , "dependencies": { "express": "3.0.x" } }
рдЕрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
$ npm install
рдирддреАрдЬрддрди, npm рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЙрди рд╕рднреА рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЛ рдЬрдЧрд╣ рджреЗрдЧрд╛, рдЬрд┐рди рдкрд░ рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
реи.реи.реи рдирдорд╕реНрддреЗ, рд╡рд┐рд╢реНрд╡!
рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ server.js рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
$ touch server.js
server.js:
var express = require('express') , app = express() , port = process.env.PORT || 3000 app.get('/', function (req, res) { res.send('Hello, World!') }) app.listen(port, function () { console.log('Listening on port ', port) })
рд╣рдо рддреБрд░рдВрдд рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░рд╛
рдЖрд╡реЗрджрди app
рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛,
app
рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред
app.get
рдлрд╝рдВрдХреНрд╢рди
рдПрдХреНрд╢рди (рдХрд╛рд░реНрд░рд╡рд╛рдИ) рдХреЛ
app.get
, рдЬрд┐рд╕рдХреА рднреВрдорд┐рдХрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛
рдкрде (рдорд╛рд░реНрдЧ) '/' рдХреЗ рд▓рд┐рдП рдХреА рдЬрд╛рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк http GET / рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
port
рд╡реИрд░рд┐рдПрдмрд▓
PORT
рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рд╡реИрд░рд┐рдПрдмрд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди 3000 рд▓реЗрддрд╛ рд╣реИред
app.listen
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдкрд░ http рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
$ node server.js
рдпрд╛
$ npm start
рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЙрдкрд▓рдмреНрдз рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ "рд╕реНрдХреНрд░рд┐рдкреНрдЯ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреИрдХреЗрдЬ.рдЬреЙрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИред
рдЕрдм
http: // localhost: 3000 / рдкрд░ рдЖрдк 'рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб!' рд▓рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
GitHub рдкрд░ рдХреБрдЫ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╣рдо рдиреЛрдб-рдбреЗрдореЛ-рдРрдк рдирд╛рдо рдХреЗ рд╕рд╛рде GitHub рдкрд░ рдПрдХ рдирдпрд╛ рднрдВрдбрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ README.md рдлрд╝рд╛рдЗрд▓ (рдЕрдЪреНрдЫрд╛ рдЯреЛрди рдирд┐рдпрдо) рдмрдирд╛рдПрдВ
$ echo '# Node.js demo app' > README.md
рдЪрд▓реЛ git рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ .gitignore рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ:
$ echo 'node_modules' > .gitignore
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдорд┐рдХрд╛рдЗрд▓ рд░реЛрдЬрд░реНрд╕ рдХреЗ
рд▓реЗрдЦ рдХреЛ рдкрдврд╝рд╛ рд╣реЛ рдФрд░ рд╡рд╣ ._ignignore рдХреЗ рд▓рд┐рдП node_modules рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЖрдкрддреНрддрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣реЗред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ, рдиреЛрдб рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ:
- рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рддреИрдирд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред
- рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
- рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди! рд╣рдо рдПрдХ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд░реЛрдХреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдБ n.js рдкреНрд░реЛрдЬреЗрдХреНрдЯ npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреИрдирд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд▓рд┐рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рд╣рдо рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, рдХрдорд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ GitHub рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ:
$ git init $ git add . $ git commit -m 'Hello, World' $ git remote add origin git@github.com:<username>/node-demo-app.git $ git push -u origin master
2.2.3 рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЕрднреА рддрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдЦреНрдд рд╕рдВрд░рдЪрдирд╛ рддрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗред рдореИрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ:
/node-demo-app |- /app | |- /controllers - | |- /models - | |- /views - html | |- config.js - | |- main.js - |- /public - - , , .. |- /tests - |- app.js - |- server.js - http
рдХреЛрдИ рднреА рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдРрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╕ рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред
2.3 рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг
рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдЯреАрдбреАрдбреА рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
BDD (рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕) рдирд╛рдордХ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рд╣рдо рдЖрд╡реЗрджрди рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг - рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо, рдФрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ - рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
2.3.1 рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг
рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреМрдЦрдЯреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо
рдореЛрдЪрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ (рдореЛрдЪрд╛, рдХреЙрдлрд╝реА-рдореЛрдХрд╛ :),
рдЬреИрд╕реЗ ,
.рдЬреЗрдПрд╕ , рдФрд░
рд╕реБрдкрд░рдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ)ред рдореЛрдЪрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, should.js рд╡рд┐рднрд┐рдиреНрди рдЪреЗрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реБрдкрд░рдЯреЗрд╕реНрдЯ рдПрдХ рд╕рд░рд▓ http рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрдб-рдСрди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ.рдЬреЙрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ
{ "name": "node-demo-app" , "version": "0.0.1" , "scripts": { "start": "node server.js" } , "dependencies": { "express": "3.0.x" } , "devDependencies": { "mocha": "1.7.0" , "should": "1.2.1" , "supertest": "0.4.0" } }
рд╣рдордиреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ "devD dependencies" рдЦрдВрдб рдореЗрдВ рд░рдЦрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
$ npm install
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдЗрдП рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдврд╛рдВрдЪреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдПрдВ
$ mkdir tests $ touch tests/test.js
Test.js рдореЗрдВ рд╣рдордиреЗ рдРрд╕реА рдкрд░реАрдХреНрд╖рд╛ рджреА
describe('Truth', function () { it('should be true', function () { true.should.be.true }) it('should not be false', function () { true.should.not.be.false }) })
рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВ
$ ./node_modules/.bin/mocha --require should --reporter spec tests/test.js
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреБрдЫ рдЯреВрдЯреА рд╣реБрдИ рдЬрдЧрд╣ рджреЗрдВ
describe('foo variable', function () { it('should equal bar', function () { foo.should.equal('bar') }) })
рд╢реБрднрд╛рд░рдВрдн
$ ./node_modules/.bin/mocha --require should --reporter spec tests
рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдирд╣реАрдВ рд╣реБрдП, рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рд╕реБрдзрд╛рд░рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдЪрд░ рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛
var foo = 'bar' describe('foo variable', function () { it('should equal bar', function () { foo.should.equal('bar') }) })
рд╢реБрднрд╛рд░рдВрдн
$ ./node_modules/.bin/mocha --require should --reporter spec tests/test.js
рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
TDD рдХрд╛ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛрдб рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ true.should.be рдХреА рд╢реИрд▓реА рдореЗрдВ рдЪреЗрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рдЪред рдЕрд░реНрдерд╛рддреН, рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрдирд╛
- рд╣рдо рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧрд┐рд░рддрд╛ рд╣реИ
- рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛
- рд╣рдо рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЪрд░рдг 3 рдкрд░ рд▓реМрдЯреЗрдВ
рдФрд░ рдРрд╕рд╛ рдХрдИ рдмрд╛рд░ред
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдЯрд╛рд╕реНрдХ рд░рди рдЯреЗрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ
$ touch Makefile
рдореЗрдХрдлрд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:
REPORTER=spec TESTS=$(shell find ./tests -type f -name "*.js") test: @NODE_ENV=test ./node_modules/.bin/mocha \ --require should \ --reporter $(REPORTER) \ $(TESTS) .PHONY: test
рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдореЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред Makefile
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВред рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд╛рд░реНрдп рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рдж рд╕рдВрдХреЗрдд рдЯреИрдм рдмрдирд╛рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд░рд┐рдХреНрдд рд╕реНрдерд╛рдиред
рдЕрдм рдЯреЗрд╕реНрдЯ-рд╕реВрдЯ рдХреЛ рдХрдорд╛рдВрдб рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
$ make test
рдЖрдЗрдП http рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдкрд░реАрдХреНрд╖рдг рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ рдРрдк / main.js рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХ рдРрдк рднреА рдмрдирд╛рдПрдВрдЧреЗред рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓ рдЬреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдЧреАред рдЕрдм рдпрд╣ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рддрдм рдХрд╛рдо рдЖрдПрдЧрд╛ рдЬрдм рд╣рдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреА рдХрд╡рд░реЗрдЬ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗред
$ mkdir app $ touch app/main.js
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / main.js:
var express = require('express') , app = express() app.get('/', function (req, res) { res.send('Hello, World!') }) module.exports = app
$ touch app.js
app.js:
module.exports = require(__dirname + '/app/main')
server.js рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ
var app = require(__dirname + '/app') , port = process.env.PORT || 3000 app.listen(port, function () { console.log('Listening on port ', port) })
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдиреЛрдб.рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреНрдпрд╛
require
рдФрд░
module.exports
рд╣рдо
рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рддреЗ рд╣реИрдВ
Http рдЕрдиреБрд░реЛрдз рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, test.js рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд▓рд┐рдЦреЗрдВ
var request = require('supertest') , app = require(__dirname + '/../app') describe('GET /', function () { it('should contain text "Hello, Express!"', function (done) { request(app) .get('/') .expect(/Hello, Express!/, done) }) })
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд░реНрд╡рд░ "рд╣реИрд▓реЛ, рдПрдХреНрд╕рдкреНрд░реЗрд╕!" рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╕рд░реНрд╡рд░ "рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб!" рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ http рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдиреБрд░реЛрдз рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореЛрдЪрд╛ рдиреЗ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ "рд╣реИрд▓реЛ, рдПрдХреНрд╕рдкреНрд░реЗрд╕!" рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде "рд╣реИрд▓реЛ, рдПрдХреНрд╕рдкреНрд░реЗрд╕!" рдРрдк / main.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдФрд░
make test
рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
2.3.2 рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╡рд░реЗрдЬ
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреЗрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХрд╡рд░реЗрдЬ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рд╣рдорд╛рд░реЗ рдЯреЗрд╕реНрдЯ-рд╕реВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ред
рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд░реАрдХреНрд╖рдг
рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ
рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ
jscoverage рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрднреА рддрдХ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
$ sudo apt-get install g++
рдлрд┐рд░ jscoverage рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
$ cd /tmp $ git clone git://github.com/visionmedia/node-jscoverage.git $ cd node-jscoverage $ ./configure && make $ sudo make install
рдЖрдЗрдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ:
$ cd ~/projects/node-tutorial/node-demo-app/
рд╣рдореЗрдВ Makefile рдФрд░ app.js рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ рддрд╛рдХрд┐ рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рддреИрдпрд╛рд░ рдХреА рдЬрд╛ рд╕рдХреЗред
makefile:
REPORTER=spec TESTS=$(shell find ./tests -type f -name "*.js") test: @NODE_ENV=test ./node_modules/.bin/mocha \ --require should \ --reporter $(REPORTER) \ $(TESTS) test-cov: app-cov @APP_COV=1 $(MAKE) --quiet test REPORTER=html-cov > coverage.html app-cov: @jscoverage app app-cov .PHONY: test
app.js:
module.exports = process.env.APP_COV ? require(__dirname + '/app-cov/main') : require(__dirname + '/app/main')
рд╣рдордиреЗ рдЯреЗрд╕реНрдЯ-рдХреЛрд╡ рдХрд╛рд░реНрдп рдХреЛ рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдЕрдм рдХрд╡рд░реЗрдЬ
make test-cov
рд░рд┐рдкреЛрд░реНрдЯ
make test-cov
рдЪрд▓рд╛рдиреЗ рдХреЗ
make test-cov
рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред App.js рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдХрд┐ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрдб рдХреЙрдкреА рд╣реЛрддреА рд╣реИ рдЬреЛ jscoverage рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░
APP_COV
рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ / app-cov рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЛ / app рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВред
рд╣рдо рд░рд┐рдкреЛрд░реНрдЯ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
$ make test-cov
рдПрдХ рдХрд╡рд░реЗрдЬред Html рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕реЗ .gitignore рдРрдк-рдХреЛрд╡ рдФрд░ рдХрд╡рд░реЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдмрд╛рдХреА рд╣реИ ред.html:
$ echo 'app-cov' >> .gitignore $ echo 'coverage.html' >> .gitignore
рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ
$ rm tests/test.js
рдФрд░ рдХрдорд┐рдЯ рдХрд░реЗрдВ
$ git add . $ git ci -m "Added testing framework" $ git push
рдбреЗрдореЛ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
github.com/DavidKlassen/node-demo-appрджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рддреАрд╕рд░рд╛ рдЕрдзреНрдпрд╛рдп рд╣реИ, рдЗрд╕рдореЗрдВ рд╣рдо рд╕рд╛рдЗрдЯ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг-рдирд┐рдпрдВрддреНрд░рдХ рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╡рд░реНрдХ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред