
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ Node.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ NHL рдореИрдЪреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЦреЗрд▓реЛрдВ рдХреЗ рджреМрд░рд╛рди рд╕реНрдХреЛрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдХреЗрддрдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рджреЛ рдЪреАрдЬреЗрдВ рдкрд╕рдВрдж рдереАрдВ: рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЦреЗрд▓ред
рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
- Node.js;
- Socket.io;
- MySportsFeed.comред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Node.js рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдбрд╛рдЙрдирд▓реЛрдб рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред
рд╕реЙрдХреЗрдЯ рдХреНрдпрд╛ рд╣реИ?
рдпрд╣ рд╡рд╣ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреЛрдбрд╝рддреА рд╣реИред рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ Node.js. рд╕рд░реНрд╡рд░ рдХрд┐рд╕реА рднреА рд╕рдордп рдХрдИ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдмрд╛рд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡рд░ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдо рддреМрд░ рдкрд░ AJAX рдкрд░ рдЪрд▓рддреЗ рдереЗред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдирдИ рдШрдЯрдирд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рд╣рд░ 10 рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорддрджрд╛рди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдиреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЛрдЭ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЦреЛрдЬ рддрдм рднреА рдХреА рдЬрд╛рддреА рдереА, рдЬрдм рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдереЗред
рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд▓реЛрдб рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдирдореВрдирд╛ рдЖрд╡реЗрджрди
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЪрд▓реЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ Node.js. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдХрдВрд╕реЛрд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдЖрдкрдХреЛ C: \ GitHub \ NodeJS рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди:
cd \GitHub\NodeJS mkdir SocketExample cd SocketExample npm init
рдореИрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдЖрдк рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдирд╛рдордХ рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдХрдорд╛рдВрдб рдкреНрд░реЙрдореНрдкреНрдЯ рдкрд░, рдирд┐рдореНрди рдЖрджреЗрд╢ рдЪрд▓рд╛рдПрдБ: npm рд╕реНрдерд╛рдкрд┐рдд рдПрдХреНрд╕рдкреНрд░реЗрд╕ --saveред
рдмреЗрд╢рдХ, рд╣рдореЗрдВ Socket.io рдкреИрдХреЗрдЬ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛: npm рд╕реНрдерд╛рдкрд┐рдд socket.io --save
рдЕрдм рдЖрдкрдХреЛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ index.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЕрдиреБрднрд╛рдЧ рд░рдЦреЗрдВ:
var app = require('express')(); var http = require('http').Server(app); app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); }); http.listen(3000, function(){ console.log('HTTP server started on port 3000'); });
рдпрджрд┐ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЖрдкрд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдирдпрд╛ HTTP рд╕рд░реНрд╡рд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, HTTP рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ 3000 рдкрд░ рд╕реБрдирддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред
рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ : 3000ред рд░рд╛рд╕реНрддрд╛ рд░реВрдЯ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, "/"ред рдкрд░рд┐рдгрд╛рдо рдПрдХ HTML index.html рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо Socket.io рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:
var io = require('socket.io')(http); io.on('connection', function(socket){ console.log('Client connection received'); });
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреЛрдб рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЖрдпрд╛рдд рдХрд░рдХреЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ io рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВред рдЬрдм рднреА рдХреЛрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдШрдЯрдирд╛ рдирд┐рдХрд╛рд▓ рджреА рдЬрд╛рддреА рд╣реИред
рдЕрдм рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, index.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдЕрдВрджрд░ рд░рдЦреЗрдВ:
<!doctype html> <html> <head> <title>Socket.IO Example</title> </head> <body> <script src="/socket.io/socket.io.js"></script> <script> var socket = io(); </script> </body> </html>
рдКрдкрд░ рдХрд╛ HTML Socket.io JavaScript рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдиреЛрдб: рдиреЛрдб index.js рдЪрд▓рд╛рдПрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ,
рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рджрд░реНрдЬ рдХрд░реЗрдВ: 3000ред рдкреГрд╖реНрда рд░рд┐рдХреНрдд рд░рд╣реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕рд╛рдВрддреНрд╡рдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдиреЛрдб рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рджреЛ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:
HTTP рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ 3000 рдкрд░ рд╢реБрд░реВ рд╣реБрдЖ
рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖрдЕрдм рдЬрдм рд╣рдо рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬреБрдбрд╝ рдЧрдП рд╣реИрдВ, рддреЛ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВред рдлрд┐рд░, рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛:
io.on('connection', function(socket){ console.log('Client connection received'); socket.emit('sendToClient', { hello: 'world' }); socket.on('receivedFromClient', function (data) { console.log(data); }); });
рдкрд┐рдЫрд▓реЗ io.on рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЛрдб рдХреА рдХрдИ рдирдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓рд╛, socket.emit, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред sendToClient рдЗрд╡реЗрдВрдЯ рдХрд╛ рдирд╛рдо рд╣реИред рдШрдЯрдирд╛рдУрдВ рдХреЗ рдирд╛рдордХрд░рдг рд╕реЗ, рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдПрдХ рдЕрдиреНрдп рдЕрдкрдбреЗрдЯ рд╕реЙрдХреЗрдЯ.рдСрди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЗрд╡реЗрдВрдЯ рдХрд╛ рдирд╛рдо рднреА рд╣реИ: ReceFromClientред рдпрд╣ рд╕рдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗ рдХрдВрд╕реЛрд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ рднреА рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдЪрд░рдг рд╕рд░реНрд╡рд░ рдХреА рддреИрдпрд╛рд░реА рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдпрд╣ рдХрд┐рд╕реА рднреА рдЬреБрдбрд╝реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдФрд░ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред
рдЪрд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ SendToClient рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдХреЛрдИ рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред
рдпрд╣ HTML рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рдЧ рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИред Index.html рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
var socket = io(); socket.on('sendToClient', function (data) { console.log(data); socket.emit('receivedFromClient', { my: 'data' }); });
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЙрдХреЗрдЯ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдорд╛рди рддрд░реНрдХ рдорд┐рд▓рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рдиред рдХреНрд▓рд╛рдЗрдВрдЯ SendToClient рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрдирддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдпрд╣ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдШрдЯрдирд╛ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрд╕реА рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореВрд▓ рдЗрд╡реЗрдВрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд FromClient рдИрд╡реЗрдВрдЯ рднреЗрдЬрддрд╛ рд╣реИред рдЬрдм рд╡рд╣ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдВрд╕реЛрд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрд╝рдорд╛рдПрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдЕрдкрдирд╛ рдиреЛрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ: рдиреЛрдб index.jsред рдлрд┐рд░
рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд░ рдореЗрдВ 3000: рд▓реЛрдб рдХрд░реЗрдВред
рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рдЖрдк JSON рд▓реЙрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ: {hello: "world"}
рдлрд┐рд░, рдЬрдм рдиреЛрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:
HTTP рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ 3000 рдкрд░ рд╢реБрд░реВ рд╣реБрдЖ
рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ
{my: 'рдбреЗрдЯрд╛'}рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSON рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА
рдЬрдм рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдЕрдкрдбреЗрдЯ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдРрд╕рд╛ рди рдХреЗрд╡рд▓ рдЦреЗрд▓ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕реНрд░реЛрдд рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╡реЗ
MySportsFeeds рдХреА рд╕реЗрд╡рд╛
рд▓реЗрдВрдЧреЗ ред рд╕реЗрд╡рд╛ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - $ 1 рдкреНрд░рддрд┐ рдорд╛рд╣ рд╕реЗ, рдзреНрдпрд╛рди рд░рдЦреЗрдВред
рдПрдХ рдмрд╛рд░ рдЖрдкрдХрд╛ рдЦрд╛рддрд╛ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЙрдирдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП NPM рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: npm mysportsfeeds-node --save рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдкреАрдЖрдИ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
var MySportsFeeds = require("mysportsfeeds-node"); var msf = new MySportsFeeds("1.2", true); msf.authenticate("********", "*********"); var today = new Date(); msf.getData('nhl', '2017-2018-regular', 'scoreboard', 'json', { fordate: today.getFullYear() + ('0' + parseInt(today.getMonth() + 1)).slice(-2) + ('0' + today.getDate()).slice(-2), force: true });
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореЗрд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рдмрджрд▓реЗрдВред
рдХреЛрдб рдЖрдЬ рдХреЗ NHL рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдкреВрд░реНрд╡рд╛рднрд╛рд╕ рдЪрд░ рд╡рд╣ рд╣реИ рдЬреЛ рддрд┐рдерд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдмрд▓ рдФрд░ рд╕рдЪреНрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рднрд▓реЗ рд╣реА рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реЛрдВред
рд╡рд░реНрддрдорд╛рди рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде, рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗ; рдкреНрд░рджрд░реНрд╢рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрддреНрддрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ, рд╣рдо рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрдЦрддреЗ рд╣реИрдВред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ gameScore рдирд╛рдордХ рдПрдХ рд╕рд░рдгреА рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЦреЗрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдмрдЪреНрдЪрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЗрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреМрди рдЦреЗрд▓ рд░рд╣рд╛ рд╣реИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд╣рд░, рдХрдИ рдЪрд░ рд╣реИрдВ рдЬреЛ рдЧреЗрдо рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдЦреЗрд▓ рдЕрднреА рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рд╣реЛрдиреЗ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдЦреЗрд▓ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдЕрдм рдХреНрдпрд╛ рдЕрд╡рдзрд┐ рд╣реИ рдФрд░ рдХрд┐рддрдирд╛ рд╕рдордп рдмрдЪрд╛ рд╣реИред рджрд╛рдВрд╡ рдкрд░ рдХреНрдпрд╛ рд╣реИ рдпрд╣ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдЕрджреНрдпрддрди
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣реЗрд▓реА рдХреЗ рд╕рднреА рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ! рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдбреЗрдЯрд╛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MySportsFeeds рдХреЗ рдкрд╛рд╕ рд╕реАрдорд┐рдд рд╕рдорд░реНрдерди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рд╣реИ: рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рд╣рд░ 10 рдорд┐рдирдЯ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреЛ рдмрд╣реБрдд рдмрд╛рд░ рдкреВрдЫрддрд╛рдЫ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рднреА рдЬреБрдбрд╝реЗ рд╣реБрдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ setInterval рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдбреЗрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ 10 рдорд┐рдирдЯ рдореЗрдВ рдПрдкреАрдЖрдИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдм рдбреЗрдЯрд╛ рдЖрддрд╛ рд╣реИ, рддреЛ рдИрд╡реЗрдВрдЯ рд╕рднреА рдХрдиреЗрдХреНрдЯреЗрдб рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЛ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЬрдм рдкрд╣рд▓реА рдмрд╛рд░ рдиреЛрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ MySportsFeeds рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ 10 рдорд┐рдирдЯ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдкрд╣рд▓реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣, рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ рдЕрдВрддрд░рд╛рд▓ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдВрдЧреЗред
рдореБрдЦреНрдп index.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ data.js. рдирд╛рдордХ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИред рдЗрд╕рдореЗрдВ index.js рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ MySportsFeeds API рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рд╣реИ:
var MySportsFeeds = require("mysportsfeeds-node"); var msf = new MySportsFeeds("1.2", true, null); msf.authenticate("*******", "******"); var today = new Date(); exports.getData = function() { return msf.getData('nhl', '2017-2018-regular', 'scoreboard', 'json', { fordate: today.getFullYear() + ('0' + parseInt(today.getMonth() + 1)).slice(-2) + ('0' + today.getDate()).slice(-2), force: true }); };
GetData рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ index.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред
var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var data = require('./data.js');
рдХреЛрдб рдХреА рдкрд╣рд▓реА рд╕рд╛рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреА рд╣реИрдВ рдФрд░ рдирд╡реАрдирддрдордбрд╛рдЯрд╛ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╣рддреА рд╣реИрдВред рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдирд╡реАрдирддрдо рд╕реВрдЪреА рд╣реИ: рдПрдХреНрд╕рдкреНрд░реЗрд╕, рдПрдЪрдЯреАрдкреА рд╕рд░реНрд╡рд░, рдЬреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕, рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдбреЗрдЯрд╛.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рднреА рдмрдирд╛рдИ рдЧрдИ рд╣реИред
рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрди рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ (рд▓реЗрдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛) рдореЗрдВ рднрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ:
рдЕрдЧрд▓реА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рд╛рдЗрдЯ рдХреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ
рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ : 3000 /) рдФрд░ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рдкреЛрд░реНрдЯ 3000 рдкрд░ рд╕реБрдирдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддреА рд╣реИрдВред
Socket.io рдХреЛ рдлрд┐рд░ рдирдП рдХрдиреЗрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рдЙрдирдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдИрд╡реЗрдВрдЯ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдХреЛрдб рдХрд╛ рдЕрдВрддрд┐рдо рдЯреБрдХрдбрд╝рд╛ рдЖрд╡рд╢реНрдпрдХ рдорддрджрд╛рди рдЕрдВрддрд░рд╛рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд╡реАрдирддрдордбрд╛рдЯрд╛ рдЪрд░ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рддрдм рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдИрд╡реЗрдВрдЯ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрдм рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдШрдЯрдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реЙрдХреЗрдЯ рдЪрд░ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрдЯреЗрдб рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдИрд╡реЗрдВрдЯ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдЕрдВрджрд░, рд╡реИрд╢реНрд╡рд┐рдХ io рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдирд╛ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рд╕реЗрдЯрдЕрдк рдкреВрд░реНрдг рд╣реИред
рдХреИрд╕рд╛ рд▓рдЧреЗрдЧрд╛
рдЕрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдлреНрд░рдВрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдЖрдзрд╛рд░ index.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ, рдЬреЛ рд╕рд░реНрд╡рд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИред рдЕрдм рдореИрдВ рдлрд╝рд╛рдЗрд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реВрдВрдЧрд╛ред
рдЪреВрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд╣рдореЗрдВ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрддрд╛ рд╣реИ, рдореИрдВ jQuery рдФрд░ JRRender рдирд╛рдордХ jQuery рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдпрд╣ рдореБрдЭреЗ рдПрдХ HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдирдПрдЪрдПрд▓ рдЧреЗрдо рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм рдЖрдк рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЪреМрдбрд╝рд╛рдИ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рдореЗрдВ 40 рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдХрдИ рдЫреЛрдЯреЗ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реВрдВрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдВ рд╕рднреА HTML рд╕рд╛рдордЧреНрд░реА рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдпрд╣рд╛рдБ рдЦреЗрд▓ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
<script id="gameTemplate" type="text/x-jsrender"> <div class="game"> <div> {{:game.awayTeam.City}} {{:game.awayTeam.Name}} at {{:game.homeTeam.City}} {{:game.homeTeam.Name}} </div> <div> {{if isUnplayed == "true" }} Game starts at {{:game.time}} {{else isCompleted == "false"}} <div>Current Score: {{:awayScore}} - {{:homeScore}}</div> <div> {{if currentIntermission}} {{:~ordinal_suffix_of(currentIntermission)}} Intermission {{else currentPeriod}} {{:~ordinal_suffix_of(currentPeriod)}}<br/> {{:~time_left(currentPeriodSecondsRemaining)}} {{else}} 1st {{/if}} </div> {{else}} Final Score: {{:awayScore}} - {{:homeScore}} {{/if}} </div> </div> </script>
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ / x-jsrender рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рддреНрдпреЗрдХ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рд╡ рдХрдВрдЯреЗрдирд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдзрд╛рд░ рд╢реИрд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдо рдХреНрд▓рд╛рд╕ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ div рдХреЗ рдЕрдВрджрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред
рдЕрдЧрд▓реА div рдЕрддрд┐рдерд┐ рдЯреАрдо рдФрд░ рдореЗрдЬрдмрд╛рди рдЯреАрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣ MySportsFeeds рдбреЗрдЯрд╛ рд╕реЗ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╢рд╣рд░ рдХреЗ рдирд╛рдо рдФрд░ рдЯреАрдо рдХреЗ рдирд╛рдо рдХреЛ рдорд┐рд▓рд╛рдХрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
{{: game.awayTeam.City}} рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдореИрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рднреМрддрд┐рдХ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ JsRender рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЬрдм рдЦреЗрд▓ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд░реЗрдЦрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЦреЗрд▓ {{: game.time}} рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдЦреЗрд▓ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ, рд╡рд░реНрддрдорд╛рди рд╕реНрдХреЛрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: {{: awayScore}} - {{: homeScore}}ред рдФрд░, рдЕрдВрдд рдореЗрдВ, рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧреА рдХрд┐ рдЕрдм рдХреНрдпрд╛ рдЕрд╡рдзрд┐ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЕрдм рд╡рд┐рд░рд╛рдо рд╣реИред
рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ currentIntermission рдЪрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореИрдВ I рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ ordinal_suffix_of рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрд╡рдзрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдореНрди рдкрд╛рда рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ: 1 (2, 3, рдЖрджрд┐) рдмреНрд░реЗрдХред
рдЬрдм рдХреЛрдИ рдмреНрд░реЗрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХрд░рдВрдЯрдкрд┐рд░рд┐рдпреЛрдб рдХреЗ рдореВрд▓реНрдп рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реВрдВред рдСрд░реНрдбрд┐рдирд▓_рд╕реБрдлреАрдХреНрд╕_рдСрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЦреЗрд▓ 1 (2, 3, рдЖрджрд┐) рдЕрд╡рдзрд┐ рдореЗрдВ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ time_left рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рддрдХ рд╢реЗрд╖ рд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: 10:12ред
рдХреЛрдб рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдЦреЗрд▓ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрдм рдкреВрд░реНрдг рдЧреЗрдореЛрдВ рдХреА рдПрдХ рдорд┐рд╢реНрд░рд┐рдд рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ, рдРрд╕реЗ рдЧреЗрдо рдЬреЛ рдЕрднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рдФрд░ рдРрд╕реЗ рдЧреЗрдо рдЬреЛ рдЕрднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ (рдореИрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрдм рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдХрд╕реНрдЯрдо рдмрдирд╛рддрд╛ рд╣реИ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдЖрд╡реЗрджрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕):

рдЕрдЧрд▓рд╛ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ рдЬреЛ рдПрдХ рд╕реЙрдХреЗрдЯ, рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди ordinal_suffix_of рдФрд░ time_left рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЪрд░ рдЬреЛ рдЙрддреНрдкрдиреНрди jQuery рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
<script> var socket = io(); var tmpl = $.templates("#gameTemplate"); var helpers = { ordinal_suffix_of: function(i) { var j = i % 10, k = i % 100; if (j == 1 && k != 11) { return i + "st"; } if (j == 2 && k != 12) { return i + "nd"; } if (j == 3 && k != 13) { return i + "rd"; } return i + "th"; }, time_left: function(time) { var minutes = Math.floor(time / 60); var seconds = time - minutes * 60; return minutes + ':' + ('0' + seconds).slice(-2); } }; </script>
рдЕрдВрддрд┐рдо рдЯреБрдХрдбрд╝рд╛ рд╕реЙрдХреЗрдЯ рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
socket.on('data', function (data) { console.log(data); $('#data').html(tmpl.render(data.scoreboard.gameScore, helpers)); });
рдореЗрд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдЖрдИрдбреА рд╡рд╛рд▓рд╛ рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рд░реЗрдВрдбрд░ (tmpl.render) рдХрд╛ рдкрд░рд┐рдгрд╛рдо HTML рдХреЛ рдЗрд╕ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ - JsRender рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ data.scoreboard.gameScore, рдЬреЛ рд╕рд░рдгреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐ рддрддреНрд╡ рдПрдХ рдЧреЗрдо рдмрдирд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ HTML рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рд╕рд╛рде рд░рдЦреЗ рдЧрдП рд╣реИрдВ:
<!doctype html> <html> <head> <title>Socket.IO Example</title> </head> <body> <div id="data"> </div> <script id="gameTemplate" type="text/x-jsrender"> <div class="game"> <div> {{:game.awayTeam.City}} {{:game.awayTeam.Name}} at {{:game.homeTeam.City}} {{:game.homeTeam.Name}} </div> <div> {{if isUnplayed == "true" }} Game starts at {{:game.time}} {{else isCompleted == "false"}} <div>Current Score: {{:awayScore}} - {{:homeScore}}</div> <div> {{if currentIntermission}} {{:~ordinal_suffix_of(currentIntermission)}} Intermission {{else currentPeriod}} {{:~ordinal_suffix_of(currentPeriod)}}<br/> {{:~time_left(currentPeriodSecondsRemaining)}} {{else}} 1st {{/if}} </div> {{else}} Final Score: {{:awayScore}} - {{:homeScore}} {{/if}} </div> </div> </script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jsrender/0.9.90/jsrender.min.js"></script> <script src="/socket.io/socket.io.js"></script> <script> var socket = io(); var helpers = { ordinal_suffix_of: function(i) { var j = i % 10, k = i % 100; if (j == 1 && k != 11) { return i + "st"; } if (j == 2 && k != 12) { return i + "nd"; } if (j == 3 && k != 13) { return i + "rd"; } return i + "th"; }, time_left: function(time) { var minutes = Math.floor(time / 60); var seconds = time - minutes * 60; return minutes + ':' + ('0' + seconds).slice(-2); } }; var tmpl = $.templates("#gameTemplate"); socket.on('data', function (data) { console.log(data); $('#data').html(tmpl.render(data.scoreboard.gameScore, helpers)); }); </script> <style> .game { border: 1px solid #000; float: left; margin: 1%; padding: 1em; width: 25%; } </style> </body> </html>
рдЕрдм рдиреЛрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рдЦреЛрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ: рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП 3000!
рдкреНрд░рддреНрдпреЗрдХ X рдорд┐рдирдЯ, рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдИрд╡реЗрдВрдЯ рднреЗрдЬрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ, рдмрджрд▓реЗ рдореЗрдВ, рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЧреЗрдо рддрддреНрд╡реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рд╕рд╛рдЗрдЯ рдХреЛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЧреЗрдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рд╣реЛрддреЗ рд░рд╣реЗрдВрдЧреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдЧреНрд░рд╛рд╣рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреЛрдИ рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рдмрджрд▓реЗ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдХреЛред рдЬрдм рд╕рд░реНрд╡рд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИред
рдЪреИрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рд╣реИред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рдЦреЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдЦреБрд╢реА рдХрд╛ рдкрд╣рд╛рдбрд╝ рдорд┐рд▓рд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣реЙрдХреА рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдЦреЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ!
