Node.JS: возможности 
для РНР-разработчика 
Морозов Андрей 
декан факультета информационно- 
компьютерных технологий ЖГТУ
1. Общие сведения 
- интерпретатор JavaScript, основанный 
на движке V8. 
Особенности: 
•использование без браузера; 
•обращение к файловой системе, 
работа с сетью; 
•асинхронный код; 
•событийно-ориентированное 
программирование; 
•библиотеки; 
Автор языка: Райан Дал 
Дата выхода: 27 мая 2009 года 
Последнее обновление: 20 октября 2014 года
2. Схема работы PHP 
• Запрос А выполняется за 1 секунду, он не требует 
обращение к БД. 
• Запрос Б выполняется за 5 секунд, причем 4 из них, он 
тратит на ожидание ответа БД. 
• Время между запросами не менее 1 секунды.
2. Схема работы PHP 
• Сервер с одним РНР-процессом
2. Схема работы PHP 
• Сервер с двумя РНР-процессами
3. Схема работы Node.JS
3. Схема работы Node.JS
4. Установка Node.JS 
• Под Linux: 
sudo apt-get install nodejs 
sudo apt-get install npm 
• Под Windows:
5. Запуск программ 
• Из командной строки: node имя_файла.js 
• Для управления запуском скриптов следует установить: 
sudo apt-get install supervisor 
sudo service supervisor start 
• Файлы конфигурации находятся в директории: 
/etc/supervisor/ 
• Для включения доступа через веб-интерфейс нужно 
добавить в файл /etc/supervisor/supervisord.conf: 
[inet_http_server] 
port = 9001 
username = логин 
password = пароль
5. Запуск программ 
• Для проекта создать файл конфигурации запуска 
Node.JS-скрипта в директории 
/etc/supervisor/conf.d/файл.conf: 
[program:проект] 
command=/usr/bin/node /путь/к файлу.js 
directory=/путь 
autostart=true 
autorestart=true 
startretries=3 
stderr_logfile=/var/log/проект/файл.err.log 
stdout_logfile=/var/log/проект/файл.out.log 
user=www-data
5. Запуск программ 
• Управление состоянием запущенных процессов через 
командную строку: 
supervisorctl start проект 
supervisorctl stop проект 
supervisorctl restart проект 
• Управление состоянием запущенных процессов через 
веб-интерфейс:
6. Интегрированные среды разработки 
• Коммерческие: 
• JetBrains WebStorm/PhpStorm или IntelliJ IDEA
6. Интегрированные среды разработки 
• Коммерческие: 
• Microsoft Visual Studio with Node.js Tools for Visual Studio
6. Интегрированные среды разработки 
• Бесплатные: 
• Облачная IDE Cloud9
6. Интегрированные среды разработки 
• Бесплатные: 
• Nodeclipse
6. Интегрированные среды разработки 
• Бесплатные: 
• NetBeans IDE с Node.JS плагином
7. Создание веб-сервера 
Простейший веб-сервер: 
var http = require('http'); 
http.createServer(function (req, res) 
{ 
res.writeHead(200, 
{'Content-Type': 'text/plain'}); 
res.end('Hello Worldn'); 
}).listen(80, '127.0.0.1'); 
console.log('Server running at 
http://127.0.0.1:80/');
7. Создание веб-сервера 
Простейший веб-сервер: 
var http = require('http'); 
http.createServer(function (req, res) 
{ 
res.writeHead(200, 
{'Content-Type': 'text/plain'}); 
res.end('Hello Worldn'); 
}).listen(80, '127.0.0.1'); 
console.log('Server running at 
http://127.0.0.1:80/');
Определение запрошенного URL: 
var http = require('http'); 
var url = require('url'); 
http.createServer(onRequest).listen(80, '127.0.0.1'); 
console.log 
('Server running at http://127.0.0.1:80/'); 
function onRequest(request, response) { 
var pathname = url.parse(request.url).pathname; 
route(pathname); 
response.writeHead(200, 
{"Content-Type": "text/plain"}); 
response.write("Hello World"); 
response.end(); 
} 
function route(path) 
{ 
console.log(path); 
} 
7. Создание веб-сервера
Определение запрошенного URL: 
var http = require('http'); 
var url = require('url'); 
http.createServer(onRequest).listen(80, '127.0.0.1'); 
console.log 
('Server running at http://127.0.0.1:80/'); 
function onRequest(request, response) { 
var pathname = url.parse(request.url).pathname; 
route(pathname); 
response.writeHead(200, 
{"Content-Type": "text/plain"}); 
response.write("Hello World"); 
response.end(); 
} 
function route(path) 
{ 
console.log(path); 
} 
7. Создание веб-сервера
8. Асинхронная модель 
Весь механизм IO Node.JS полностью 
асинхронен: 
•обработка HTTP- и TCP-запросов; 
•чтение и запись файлов; 
•запросы к БД; 
Если что-то делается не асинхронно – 
это делается неправильно!
8. Асинхронная модель 
Весь механизм IO Node.JS полностью 
асинхронен: 
•обработка HTTP- и TCP-запросов; 
•чтение и запись файлов; 
•запросы к БД; 
Если что-то делается не асинхронно – 
это делается неправильно!
Код, содержащий логическую ошибку: 
var http = require('http'); 
var fs = require('fs') 
http.createServer(onRequest).listen(80, '127.0.0.1'); 
function onRequest(request, response) { 
var readData; 
fs.readFile('www/index.html', 'utf8', 
function (err, data) { 
if (err) { 
return console.log(err); 
} 
readData = data.toString(); 
}); 
response.writeHead(200, 
{"Content-Type": "text/html"}); 
response.write(readData); 
response.end(); 
} 
8. Асинхронная модель
Правильный код: 
var http = require('http'); 
var fs = require('fs') 
http.createServer(onRequest).listen(80, '127.0.0.1'); 
function onRequest(request, response) { 
fs.readFile('www/index.html', 'utf8', 
function (err, data) { 
response.writeHead(200, 
{"Content-Type": "text/html"}); 
if (err) { 
console.log(err); 
response.write('Read file error!'); 
} else 
response.write(data.toString()); 
response.end(); 
}); 
}} 
8. Асинхронная модель
Плохо: 
var fs = require('fs') 
var configData = 
fs.readFileSync('config.xml'); 
response.write(configData); 
Хорошо: 
var fs = require('fs') 
fs.readFile('config.xml', 
function(err, configData) 
{ 
response.write(configData); 
}); 
8. Асинхронная модель
9. Статический веб-сервер 
var http = require("http"), url = require("url"), 
path = require("path"), fs = require("fs"); 
var directory = "/www/"; 
port = process.argv[2] || 80; 
http.createServer(function(request, response) { 
var uri = url.parse(request.url).pathname, 
filename = path.join(process.cwd() + directory, uri); 
path.exists(filename, function(exists) { 
console.log(filename); 
if(!exists) { 
response.writeHead(404, {"Content-Type": "text/plain"}); 
response.write("404 Not Foundn"); 
response.end(); 
return; 
} 
if (fs.statSync(filename).isDirectory()) filename += '/index.html'; 
fs.readFile(filename, "binary", function(err, file) { 
if(err) { 
response.writeHead(500, {"Content-Type": "text/plain"}); 
response.write(err + "n"); 
response.end(); 
return; 
} 
response.writeHead(200); 
response.write(file, "binary"); 
response.end(); 
}); 
}); 
}).listen(parseInt(port, 10));
10. Фреймворк Express 
• Для установки библиотек и фреймворков: 
npm install –g библиотека 
• Для установки фреймворка express: 
npm install –g express 
• Статический сервер на Express 
var express = require('express'); 
var app = express(); 
app.use(express.static( 
__dirname + '/www')); 
app.listen(80);
10. Фреймворк Express 
• Обработка GET-запросов: 
var express = require('express'); 
var app = express(); 
app.get('/hello', function(req, res){ 
res.send('hello world'); 
}); 
app.get('/user/:id', function(req, res){ 
res.send('user ' + req.params.id); 
}); 
app.get(/^/books?(?:/(d+)(?:..(d+))?)?/, 
function(req, res){ 
res.send(req.params); 
}); 
app.use(express.static(__dirname + '/www')); 
app.listen(80);
Серверная часть (server.js): 
var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
app.get('/', function(req, res){ 
res.sendFile(__dirname + '/www/index.html'); 
}); 
io.on('connection', function(socket){ 
socket.on('chat message', function(msg){ 
io.emit('chat message', msg); 
}); 
}); 
http.listen(3000, function(){ 
console.log('listening on *:3000'); 
}); 
11. Веб-сокеты (socket.io)
11. Веб-сокеты (socket.io) 
Клиентская часть (index.html): 
<!doctype html> 
<html> 
<head> 
<title>Socket.IO chat</title> 
<style> 
* { margin: 0; padding: 0; box-sizing: border-box; } 
body { font: 13px Helvetica, Arial; } 
form { background: #000; padding: 3px; position: 
fixed; bottom: 0; width: 100%; } 
form input { border: 0; padding: 10px; width: 90%; 
margin-right: .5%; } 
form button { width: 9%; background: rgb(130, 224, 
255); border: none; padding: 10px; } 
#messages { list-style-type: none; margin: 0; 
padding: 0; } 
#messages li { padding: 5px 10px; } 
#messages li:nth-child(odd) { background: #eee; } 
</style>
Клиентская часть (index.html): 
<script src="http://localhost:3000/socket.io/socket.io.js"> 
</script> 
<script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
<script> 
var socket = io(); 
$('form').submit(function(){ 
socket.emit('chat message', $('#m').val()); 
$('#m').val(''); 
return false; 
}); 
socket.on('chat message', function(msg){ 
$('#messages').append($('<li>').text(msg)); 
}); 
</script> 
</head> 
11. Веб-сокеты (socket.io)
Клиентская часть (index.html): 
<body> 
<ul id="messages"></ul> 
<form action=""> 
<input id="m" autocomplete="off" /> 
<button>Send</button> 
</form> 
</body> 
</html> 
11. Веб-сокеты (socket.io)
11. Веб-сокеты (socket.io) 
Адрес http://localhost:3000/socket.io/socket.io.js:
11. Веб-сокеты (socket.io)
12. Работа с базой данных MySQL 
• Установить библиотеку mysql: 
npm install mysql 
• Соединение с базой данных: 
var mysql = require('mysql'); 
var connection = 
mysql.createConnection({ 
host : 'localhost', 
user : 'me', 
password : 'secret' 
}); 
connection.connect();
12. Работа с базой данных MySQL 
• Выполнение запросов: 
connection.query('SELECT user_id, 
user_login as login FROM users', 
function(err, rows, fields) { 
if (err) throw err; 
console.log('The login is: ', 
rows[0]. login); 
}); 
• Подготовленные запросы: 
connection.query('SELECT * FROM users 
WHERE user_id = ?', [userId], 
function(err, results) { 
// ... 
});
Appjs: 
var app = module.exports = require('appjs'); 
app.serveFilesFrom(__dirname + '/content'); 
var window = app.createWindow({ 
width : 640, height : 460, icons : __dirname + '/content/icons' 
}); 
window.on('create', function(){ 
console.log("Window Created"); 
window.frame.show(); 
window.frame.center(); 
}); 
window.on('ready', function(){ 
console.log("Window Ready"); 
window.require = require; 
window.process = process; 
window.module = module; 
window.addEventListener('keydown', function(e){ 
if (e.keyIdentifier === 'F12') { 
window.frame.openDevTools(); 
} 
}); 
}); 
window.on('close', function(){ 
console.log("Window Closed"); 
}); 
12. Оконные приложения
13. Тесты производительности 
• Программа на Node.JS 
var sys = require('sys'), 
http = require('http'); 
http.createServer(function(req, res) { 
res.writeHead(200, {'Content-Type': 
'text/html'}); 
res.write('<p>Hello World</p>'); 
res.end(); 
}).listen(8080); 
• Программа на PHP 
<?php 
echo '<p>Hello World</p>';
13. Тесты производительности 
• 100 000 запросов, 1 000 одновременных 
Время Запросов в сек. 
Apache PHP 121.451 сек 823.38 
nodeJS 21.162 сек. 4725.43 
• 1 000 000 запросов, 20 000 одновременных 
Время Запросов в сек. 
Apache PHP 3570.753 сек 280.05 
nodeJS 1043.076 сек 958.70
13. Тесты производительности 
Загрузка процессора
13. Тесты производительности 
Использование памяти
14. Раскол в группе разработчиков Node.JS 
• создан форк Node.JS под названием io.js; 
• первый релиз готовится к выпуску 13 января 2015 года; 
• io.js будет Node.JS-совместимым;
Спасибо за внимание! 
Морозов Андрей Васильевич, 
к.т.н., декан факультета информационно- 
компьютерных технологий ЖГТУ, 
morozov.andriy@gmail.com

More Related Content

PPTX
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
PPTX
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
PDF
Семь тысяч Rps, один go
PDF
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
PDF
Web осень 2013 лекция 1
PPTX
Метапрограммирование с примерами на JavaScript
PDF
Компиляция скриптов PHP. Алексей Романенко
PDF
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Семь тысяч Rps, один go
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Web осень 2013 лекция 1
Метапрограммирование с примерами на JavaScript
Компиляция скриптов PHP. Алексей Романенко
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...

What's hot (20)

PDF
еще один недостаток современных клиент серверных приложений
PDF
02 - Web-технологии. Web-клиенты
PPT
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
PDF
Introduction in Node.js (in russian)
PPT
Воюем за ресурсы (ZFConf2011)
PPTX
Sphinx: распределяя индексы.
PDF
"Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов (...
PPTX
"Великолепный API без Rest", Констатин Якушев (Badoo)
PDF
Веб-сервер
PDF
Спецификация WSGI (PEP-333)
PPT
PPTX
Impress Application Server for node.js (ru)
PDF
Offzone | Another waf bypass
PDF
01 - Web-технологии. Архитектура Web приложений
PDF
PDF
07 - Web-технологии. Web-сервера
PDF
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
PDF
Превышаем скоростные лимиты с Angular 2
PPTX
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
PPTX
Everything you wanted to know about writing async, high-concurrency HTTP apps...
еще один недостаток современных клиент серверных приложений
02 - Web-технологии. Web-клиенты
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
Introduction in Node.js (in russian)
Воюем за ресурсы (ZFConf2011)
Sphinx: распределяя индексы.
"Успеть за 100 миллисекунд: контекстная реклама на Sphinx" Дмитрий Хасанов (...
"Великолепный API без Rest", Констатин Якушев (Badoo)
Веб-сервер
Спецификация WSGI (PEP-333)
Impress Application Server for node.js (ru)
Offzone | Another waf bypass
01 - Web-технологии. Архитектура Web приложений
07 - Web-технологии. Web-сервера
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Превышаем скоростные лимиты с Angular 2
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Ad

Viewers also liked (15)

PDF
Асинхронность и параллелизм в Node.js
KEY
Node.js - Best practices
PPT
Node.js (Андрей Костенко)
PDF
Node.js ♥ БЭМ: модульный фронтенд
PDF
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js"
PPT
ВВЕДЕНИЕ В NODE.JS
PPT
Node js presentation
PDF
Introduction to Nodejs
PPTX
Nodejs intro
PDF
NodeJS for Beginner
PDF
Anatomy of a Modern Node.js Application Architecture
PPTX
Introduction to Node.js
PDF
Секреты презентации. Как сделать презентацию для спикера?
PDF
reveal.js 3.0.0
Асинхронность и параллелизм в Node.js
Node.js - Best practices
Node.js (Андрей Костенко)
Node.js ♥ БЭМ: модульный фронтенд
JSLab.Сергей Пузанков. "Разработка небольшого проекта c BEM и node.js"
ВВЕДЕНИЕ В NODE.JS
Node js presentation
Introduction to Nodejs
Nodejs intro
NodeJS for Beginner
Anatomy of a Modern Node.js Application Architecture
Introduction to Node.js
Секреты презентации. Как сделать презентацию для спикера?
reveal.js 3.0.0
Ad

Similar to Node.JS: возможности для РНР-разработчика (20)

PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PPTX
Взломать сайт на ASP.NET
PPT
PDF
Mihail davidov js-ajax
PDF
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
PDF
Михаил Давыдов — Транспорт, Ajax
PDF
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
PPTX
Платформа .NET Core глазами PHP-разработчика
PDF
Как превратить приложение в платформу
PPTX
современная практика статического анализа безопасности кода веб приложений
PPTX
Alexei Sintsov - "Between error and vulerability - one step"
PPTX
Взломать Web-сайт на ASP.NET? Сложно, но можно!
PDF
Компиляция скриптов PHP (Алексей Романенко)
PPTX
Простой и кросс-платформенный WEB-сервер на .NET
PDF
Доставка данных в реальном времени.
PDF
Devcamp nodejs-2010
PDF
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
PDF
Серверный JavaScript: NodeJS и CouchDB
Node.js введение в технологию, КПИ #ITmeetingKPI
Взломать сайт на ASP.NET
Mihail davidov js-ajax
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
Михаил Давыдов — Транспорт, Ajax
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Платформа .NET Core глазами PHP-разработчика
Как превратить приложение в платформу
современная практика статического анализа безопасности кода веб приложений
Alexei Sintsov - "Between error and vulerability - one step"
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Компиляция скриптов PHP (Алексей Романенко)
Простой и кросс-платформенный WEB-сервер на .NET
Доставка данных в реальном времени.
Devcamp nodejs-2010
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDB

Node.JS: возможности для РНР-разработчика

  • 1. Node.JS: возможности для РНР-разработчика Морозов Андрей декан факультета информационно- компьютерных технологий ЖГТУ
  • 2. 1. Общие сведения - интерпретатор JavaScript, основанный на движке V8. Особенности: •использование без браузера; •обращение к файловой системе, работа с сетью; •асинхронный код; •событийно-ориентированное программирование; •библиотеки; Автор языка: Райан Дал Дата выхода: 27 мая 2009 года Последнее обновление: 20 октября 2014 года
  • 3. 2. Схема работы PHP • Запрос А выполняется за 1 секунду, он не требует обращение к БД. • Запрос Б выполняется за 5 секунд, причем 4 из них, он тратит на ожидание ответа БД. • Время между запросами не менее 1 секунды.
  • 4. 2. Схема работы PHP • Сервер с одним РНР-процессом
  • 5. 2. Схема работы PHP • Сервер с двумя РНР-процессами
  • 8. 4. Установка Node.JS • Под Linux: sudo apt-get install nodejs sudo apt-get install npm • Под Windows:
  • 9. 5. Запуск программ • Из командной строки: node имя_файла.js • Для управления запуском скриптов следует установить: sudo apt-get install supervisor sudo service supervisor start • Файлы конфигурации находятся в директории: /etc/supervisor/ • Для включения доступа через веб-интерфейс нужно добавить в файл /etc/supervisor/supervisord.conf: [inet_http_server] port = 9001 username = логин password = пароль
  • 10. 5. Запуск программ • Для проекта создать файл конфигурации запуска Node.JS-скрипта в директории /etc/supervisor/conf.d/файл.conf: [program:проект] command=/usr/bin/node /путь/к файлу.js directory=/путь autostart=true autorestart=true startretries=3 stderr_logfile=/var/log/проект/файл.err.log stdout_logfile=/var/log/проект/файл.out.log user=www-data
  • 11. 5. Запуск программ • Управление состоянием запущенных процессов через командную строку: supervisorctl start проект supervisorctl stop проект supervisorctl restart проект • Управление состоянием запущенных процессов через веб-интерфейс:
  • 12. 6. Интегрированные среды разработки • Коммерческие: • JetBrains WebStorm/PhpStorm или IntelliJ IDEA
  • 13. 6. Интегрированные среды разработки • Коммерческие: • Microsoft Visual Studio with Node.js Tools for Visual Studio
  • 14. 6. Интегрированные среды разработки • Бесплатные: • Облачная IDE Cloud9
  • 15. 6. Интегрированные среды разработки • Бесплатные: • Nodeclipse
  • 16. 6. Интегрированные среды разработки • Бесплатные: • NetBeans IDE с Node.JS плагином
  • 17. 7. Создание веб-сервера Простейший веб-сервер: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn'); }).listen(80, '127.0.0.1'); console.log('Server running at http://127.0.0.1:80/');
  • 18. 7. Создание веб-сервера Простейший веб-сервер: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Worldn'); }).listen(80, '127.0.0.1'); console.log('Server running at http://127.0.0.1:80/');
  • 19. Определение запрошенного URL: var http = require('http'); var url = require('url'); http.createServer(onRequest).listen(80, '127.0.0.1'); console.log ('Server running at http://127.0.0.1:80/'); function onRequest(request, response) { var pathname = url.parse(request.url).pathname; route(pathname); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } function route(path) { console.log(path); } 7. Создание веб-сервера
  • 20. Определение запрошенного URL: var http = require('http'); var url = require('url'); http.createServer(onRequest).listen(80, '127.0.0.1'); console.log ('Server running at http://127.0.0.1:80/'); function onRequest(request, response) { var pathname = url.parse(request.url).pathname; route(pathname); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } function route(path) { console.log(path); } 7. Создание веб-сервера
  • 21. 8. Асинхронная модель Весь механизм IO Node.JS полностью асинхронен: •обработка HTTP- и TCP-запросов; •чтение и запись файлов; •запросы к БД; Если что-то делается не асинхронно – это делается неправильно!
  • 22. 8. Асинхронная модель Весь механизм IO Node.JS полностью асинхронен: •обработка HTTP- и TCP-запросов; •чтение и запись файлов; •запросы к БД; Если что-то делается не асинхронно – это делается неправильно!
  • 23. Код, содержащий логическую ошибку: var http = require('http'); var fs = require('fs') http.createServer(onRequest).listen(80, '127.0.0.1'); function onRequest(request, response) { var readData; fs.readFile('www/index.html', 'utf8', function (err, data) { if (err) { return console.log(err); } readData = data.toString(); }); response.writeHead(200, {"Content-Type": "text/html"}); response.write(readData); response.end(); } 8. Асинхронная модель
  • 24. Правильный код: var http = require('http'); var fs = require('fs') http.createServer(onRequest).listen(80, '127.0.0.1'); function onRequest(request, response) { fs.readFile('www/index.html', 'utf8', function (err, data) { response.writeHead(200, {"Content-Type": "text/html"}); if (err) { console.log(err); response.write('Read file error!'); } else response.write(data.toString()); response.end(); }); }} 8. Асинхронная модель
  • 25. Плохо: var fs = require('fs') var configData = fs.readFileSync('config.xml'); response.write(configData); Хорошо: var fs = require('fs') fs.readFile('config.xml', function(err, configData) { response.write(configData); }); 8. Асинхронная модель
  • 26. 9. Статический веб-сервер var http = require("http"), url = require("url"), path = require("path"), fs = require("fs"); var directory = "/www/"; port = process.argv[2] || 80; http.createServer(function(request, response) { var uri = url.parse(request.url).pathname, filename = path.join(process.cwd() + directory, uri); path.exists(filename, function(exists) { console.log(filename); if(!exists) { response.writeHead(404, {"Content-Type": "text/plain"}); response.write("404 Not Foundn"); response.end(); return; } if (fs.statSync(filename).isDirectory()) filename += '/index.html'; fs.readFile(filename, "binary", function(err, file) { if(err) { response.writeHead(500, {"Content-Type": "text/plain"}); response.write(err + "n"); response.end(); return; } response.writeHead(200); response.write(file, "binary"); response.end(); }); }); }).listen(parseInt(port, 10));
  • 27. 10. Фреймворк Express • Для установки библиотек и фреймворков: npm install –g библиотека • Для установки фреймворка express: npm install –g express • Статический сервер на Express var express = require('express'); var app = express(); app.use(express.static( __dirname + '/www')); app.listen(80);
  • 28. 10. Фреймворк Express • Обработка GET-запросов: var express = require('express'); var app = express(); app.get('/hello', function(req, res){ res.send('hello world'); }); app.get('/user/:id', function(req, res){ res.send('user ' + req.params.id); }); app.get(/^/books?(?:/(d+)(?:..(d+))?)?/, function(req, res){ res.send(req.params); }); app.use(express.static(__dirname + '/www')); app.listen(80);
  • 29. Серверная часть (server.js): var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req, res){ res.sendFile(__dirname + '/www/index.html'); }); io.on('connection', function(socket){ socket.on('chat message', function(msg){ io.emit('chat message', msg); }); }); http.listen(3000, function(){ console.log('listening on *:3000'); }); 11. Веб-сокеты (socket.io)
  • 30. 11. Веб-сокеты (socket.io) Клиентская часть (index.html): <!doctype html> <html> <head> <title>Socket.IO chat</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font: 13px Helvetica, Arial; } form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; } form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; } form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages li { padding: 5px 10px; } #messages li:nth-child(odd) { background: #eee; } </style>
  • 31. Клиентская часть (index.html): <script src="http://localhost:3000/socket.io/socket.io.js"> </script> <script src="http://code.jquery.com/jquery-1.11.1.js"></script> <script> var socket = io(); $('form').submit(function(){ socket.emit('chat message', $('#m').val()); $('#m').val(''); return false; }); socket.on('chat message', function(msg){ $('#messages').append($('<li>').text(msg)); }); </script> </head> 11. Веб-сокеты (socket.io)
  • 32. Клиентская часть (index.html): <body> <ul id="messages"></ul> <form action=""> <input id="m" autocomplete="off" /> <button>Send</button> </form> </body> </html> 11. Веб-сокеты (socket.io)
  • 33. 11. Веб-сокеты (socket.io) Адрес http://localhost:3000/socket.io/socket.io.js:
  • 35. 12. Работа с базой данных MySQL • Установить библиотеку mysql: npm install mysql • Соединение с базой данных: var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'me', password : 'secret' }); connection.connect();
  • 36. 12. Работа с базой данных MySQL • Выполнение запросов: connection.query('SELECT user_id, user_login as login FROM users', function(err, rows, fields) { if (err) throw err; console.log('The login is: ', rows[0]. login); }); • Подготовленные запросы: connection.query('SELECT * FROM users WHERE user_id = ?', [userId], function(err, results) { // ... });
  • 37. Appjs: var app = module.exports = require('appjs'); app.serveFilesFrom(__dirname + '/content'); var window = app.createWindow({ width : 640, height : 460, icons : __dirname + '/content/icons' }); window.on('create', function(){ console.log("Window Created"); window.frame.show(); window.frame.center(); }); window.on('ready', function(){ console.log("Window Ready"); window.require = require; window.process = process; window.module = module; window.addEventListener('keydown', function(e){ if (e.keyIdentifier === 'F12') { window.frame.openDevTools(); } }); }); window.on('close', function(){ console.log("Window Closed"); }); 12. Оконные приложения
  • 38. 13. Тесты производительности • Программа на Node.JS var sys = require('sys'), http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<p>Hello World</p>'); res.end(); }).listen(8080); • Программа на PHP <?php echo '<p>Hello World</p>';
  • 39. 13. Тесты производительности • 100 000 запросов, 1 000 одновременных Время Запросов в сек. Apache PHP 121.451 сек 823.38 nodeJS 21.162 сек. 4725.43 • 1 000 000 запросов, 20 000 одновременных Время Запросов в сек. Apache PHP 3570.753 сек 280.05 nodeJS 1043.076 сек 958.70
  • 40. 13. Тесты производительности Загрузка процессора
  • 41. 13. Тесты производительности Использование памяти
  • 42. 14. Раскол в группе разработчиков Node.JS • создан форк Node.JS под названием io.js; • первый релиз готовится к выпуску 13 января 2015 года; • io.js будет Node.JS-совместимым;
  • 43. Спасибо за внимание! Морозов Андрей Васильевич, к.т.н., декан факультета информационно- компьютерных технологий ЖГТУ, [email protected]