Перевод серии статей по основам работы с 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 по этой ссылке.