Перевод серии статей по основам работы с Node.js, написанной Ником Даггером. Оригинал статей находится на tech.pro.
Введение
В этой серии мы будем использовать io.js с флагом --es_staging
, так мы можем получить доступ к обновленному V8 (JS движок от Google) и новым фишкам ES6, таким как классы.
Мы будем рассматривать возможности Node и то, как их использовать без фреймворков. Да, фреймворки хороши — они учитывают многие вопросы, возникающие при разработке с нуля, но решать вопросы, используя код, который ты не понимаешь, может быть неприятно.
Эта серия содержит всё для обучения. Мы создадим свой сервер, научимся обслуживать HTML-файлы и затем проложим маршруты к обработчикам (контроллерам).
Почему Node?
Мне нравится идея написания кода на одном языке или, по крайне мере, уменьшения количества языков, на которых я должен писать. В Tech.pro мы используем C#, JavaScript и T-SQL. Все три языка имеют свой собственный синтаксис и переход от одного к другому не идеален.
David Kent, Соучредитель SIOPCO
Сейчас, при работе в интернете, Javascript является обязательным. JavaScript повсюду в фронтенде: фреймворках, таких как Angular и библиотеках, таких как jQuery. Node позволяет использовать этот же язык на серверной стороне, что позволяет беспрепятственно работать между сервером и браузером.
Также, Node — это скорость! В беспристрастном сравнении: производительность Node.JS vs .NET, вы можете видеть, что Node на самом деле слегка быстрее ASP.NET! Это визуализировано на следующем графике:
Изображение принадлежит Salman Quazi.
Приступая к работе
Первое, что мы сделаем — это создадим файл app.js
и в верхней его части подключим модуль http
, отвечающий за работу с HTTP интерфейсом:
'use strict';
let http = require('http');
Теперь мы будем использовать метод createServer
подключенного модуля http. Этот метод возвращает экземпляр http.Server
. При этом укажем определенный порт, который будет прослушивать сервер:
'use strict';
let http = require('http');
http.createServer(function(request, response) {
}).listen(80);
Отлично, теперь у нас есть сервер! Но постойте-ка, ничего не происходит, хотя это не так...
Следующим шагом будет научить сервер отвечать на наши запросы. То, что мы хотим сделать — это научить сервер читать и обслуживать HTML-файлы.
Чтобы работать с HTML-файлами, нам нужно создать их. Давайте добавим в директорию файл index.html
с произвольным содержимым.
Обслуживание HTML-файлов
Для того, чтобы прочитать файл нам понадобится доступ к файловой системе, который можно получить, подключив модуль fs
. Так что давайте подключим его и используем метод readFile
.
'use strict';
let http = require('http'),
fs = require('fs');
http.createServer(function(request, response) {
fs.readFile('index.html', { encoding: 'utf8' }, function(error, file) {
});
}).listen(80);
Приведенный выше код должен быть вполне понятен, но давайте рассмотрим его подробнее. Метод readFile
асинхронный, то есть после завершения чтения файла (или получения ошибки) будет получен доступ к функции обратного вызова (callback). Мы также можем указать кодировку, в которой будет возвращаться содержимое файла. В нашем случае — это utf-8
.
Теперь, когда мы прочитали наш HTML-файл, я предполагаю, что мы должны ответить на запрос его содержимым. Это делается с помощью объекта respond
и нескольких его методов.
Первый метод writeHead
. Он принимает два аргумента: код статуса сервера и объект, содержащий тип контента (среди прочего).
response.writeHead(200, { 'Content-Type': 'text/html' });
Следующий метод write
, где мы пишем контент или, в нашем случае, HTML-файл:
response.write(file);
Наконец, мы должны завершить наш ответ, используя метод end
. Все вместе с остальным кодом будет выглядеть так:
'use strict';
let http = require('http'),
fs = require('fs');
http.createServer(function(request, response) {
fs.readFile('index.html', { encoding: 'utf8' }, function(error, file) {
if (!error) {
response.writeHead(200, { 'Content-Type': 'text/html'});
response.write(file);
response.end();
}
});
}).listen(80);
Теперь, когда у нас есть базовый сервер, самое время пойти дальше и запустить его в io.js, выполнив команду: iojs --es_staging app
.
На данный момент, вы можете перейти в браузере по адресу localhost (не забудьте указать порт, если вы выбрали отличный от 80). То, что вы видите в браузере — содержимое файла index.html
, который был создан ранее.
Ура, теперь у нас функционирует сервер, который может обслуживать HTML-файл!
Но что, если мы хотим обслуживать HTML-файлы в зависимости от указанного пути в адресной строке? Это называется маршрутизацией, которая будет рассматриваться во второй части этой серии статей.
GitHub
Для удобства чтения и рассмотрения кода я собрал весь код из статьи в репозиторий, доступный на GitHub по этой ссылке.