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

Навигация