Статьи

Обслуживание статических файлов с Node.js

В этой статье мы рассмотрим настройку статического файлового сервера с использованием Node. Есть много доступных модулей, чтобы помочь нам сделать это, но мы собираемся сосредоточиться на трех из них: node-static , paperboy и http-server .

Все эти модули доступны через npm (Node Package Manager) . Начиная с версии 0.6.3 , пакет npm был упакован с узлом, но если он не установлен, его достаточно легко сделать с помощью одной строки:

 curl http://npmjs.org/install.sh |  ш

Давайте посмотрим на каждый статический файловый сервер по очереди, начиная с node-static.

Узел-статические

node-static может быть установлен через npm с помощью следующей команды:

 npm установить узел-статический

Чтобы использовать его: включите модуль в ваш скрипт через функцию require, создайте сервер, передайте ему ваши предпочтительные параметры и скажите, чтобы он обслуживал файлы:

 var static = require ('node-static'),
   http = require ('http'),
   util = require ('util');

 var webroot = './public',
   порт = 8080;

 var file = new (static.Server) (webroot, { 
   кеш: 600, 
   заголовки: {'X-Powered-By': 'node-static'} 
 });

 http.createServer (function (req, res) {
   req.addListener ('end', function () {
     file.serve (req, res, function (err, result) {
       if (err) {
         console.error («Ошибка обслуживания% s -% s», req.url, err.message);
         if (err.status === 404 || err.status === 500) {
           file.serveFile (util.format ('/% d.html', err.status), err.status, {}, req, res);
         } еще {
           res.writeHead (err.status, err.headers);
           Отправить();
         }
       } еще {
         console.log ('% s -% s', req.url, res.message); 
       }
     });
   });
 .}) Слушать (порт);

 console.log ('node-static работает на http: // localhost:% d', порт);

Здесь, когда мы создаем новый экземпляр статического узла-сервера, мы передаем его:

  • каталог, из которого мы хотим, чтобы он обслуживал файлы, с помощью переменной `webroot` (по умолчанию для node-static используются файлы из текущего каталога, если не указано иное)
  • значение кэша 600, поэтому каждый обслуживаемый файл будет кэшироваться в течение 10 минут (значение по умолчанию для кэша — 3600, то есть файлы кэшируются в течение 1 часа)
  • настраиваемый заголовок «X-Powered-By» (я использовал X-Powered-By исключительно в качестве примера — вы можете или не хотите раскрывать программное обеспечение, на котором работает сервер )

Затем мы используем функцию createServer модуля http и добавляем обработчик события для конечного события запроса, где мы используем наш экземпляр node-static для обслуживания файлов.

Когда мы вызываем file.serve, мы передаем ему необязательную функцию обратного вызова, которая позволяет нам настроить способ обработки любых ошибок:

  • мы проверяем err.status и обслуживаем соответственно 404.html или 500.html
  • если есть ошибка и код состояния отличается от 404 или 500, мы отправляем код состояния и заголовки обратно клиенту явно — когда вы передаете функцию обратного вызова в file.serve и возникает ошибка, node-static будет не отвечать клиенту сам по себе.

газетчик

paperboy предоставляет свободный API для настройки вашего сервера, который позволяет вам настраивать порт и IP-адрес, устанавливать заголовки HTTP и обрабатывать события до запроса и после ответа. Вы также можете сказать ему, что делать в случае ошибки. Давайте посмотрим, как мы можем использовать paperboy для создания статического файлового сервера:

 var paperboy = require ('paperboy'),
     http = require ('http'),
     путь = требуется («путь»);

 var webroot = path.join (__dirname, 'public'),
     порт = 8080;

 http.createServer (function (req, res) {
   var ip = req.connection.remoteAddress;
   газетчик
     .deliver (webroot, req, res)
     .addHeader («X-Powered-By», «Atari»)
     .before (function () {
       console.log ('Запрос получен для' + req.url);
     })
     .after (function (statusCode) {
       console.log (statusCode + '-' + req.url + '' + ip);
     })
     .error (function (statusCode, msg) {
       console.log ([statusCode, msg, req.url, ip] .join (''));
       res.writeHead (statusCode, {'Content-Type': 'text / plain'});
       res.end ('Error [' + statusCode + ']');
     })
     .otherwise (function (err) {
       console.log ([404, err, req.url, ip] .join (''));
       res.writeHead (404, {'Content-Type': 'text / plain'});
       res.end («Ошибка 404: файл не найден»);
     });
 .}) Слушать (порт);

 console.log ('разносчик газет на своем раунде по адресу http: // localhost:' + port);

После импорта необходимых нам модулей мы используем пару переменных для хранения веб-корня, из которого мы хотим получать документы, и порта, который мы хотим, чтобы наш сервер прослушивал. Обратите внимание, что текущая версия paperboy (0.0.3) не поддерживает webroot, указанный с относительным путем к файлу, например ./public. Поэтому мы используем path.join (__dirname, ‘public’), чтобы дать нам абсолютный путь к общедоступной папке, из которой мы хотим обслуживать файлы ( __dirname является одним из глобалов Node и дает нам имя каталога, в котором живет текущий исполняемый скрипт в).

Мы передаем webroot в функцию доставки, чтобы paperboy знал, из какого каталога будут обслуживаться файлы. Затем addHeader добавляет несколько заголовков HTTP. Он принимает два аргумента: имя заголовка и значение заголовка. Затем мы используем функции before, after, error и другие, чтобы добавить обработчики событий через некоторые функции обратного вызова:

  • before запускает функцию обратного вызова непосредственно перед доставкой запрошенного файла. Чтобы остановить обслуживаемый файл, вы можете вернуть false из функции обратного вызова.
  • after запустит функцию обратного вызова, как только ответ будет отправлен обратно клиенту и файл будет доставлен. В функцию обратного вызова передается единственный аргумент, представляющий код состояния ответа HTTP, отправленного обратно клиенту.
  • Ошибка срабатывает, если что-то идет не так во время обработки запроса. Обратному вызову передаются два аргумента: код состояния HTTP ответа и сообщение об ошибке. Обратите внимание, что вам необходимо самостоятельно закрыть соединение с сервером в функции обратного вызова с ошибкой; пример выше делает это со строкой response.end (…).
  • в противном случае срабатывает, если в webroot не найден соответствующий файл или если из функции before callback было возвращено false. Обратной функции передается единственный аргумент, содержащий подробности ошибки. Функция обратного вызова paperboy по умолчанию показывает простую страницу HTTP 404 File Not Found.

Наконец, мы сообщаем серверу, какой порт слушать. Обратите внимание, что когда он получает запрос на ‘/’, paperboy добавляет index.html и обслуживает этот файл по умолчанию, пока существует index.html.

HTTP-сервер

Наконец, давайте посмотрим на http-сервер . Установка выполняется через npm, но убедитесь, что вы передаете npm ключ -g, чтобы http-сервер был доступен глобально:

 npm установить http-сервер -g

Установка http-сервера таким образом делает его доступным через командную строку:

 $> введите http-сервер
 http-сервер хешируется (/ usr / local / bin / http-server)

Поскольку он доступен из командной строки, вам не нужно писать код для его запуска и работы. Все, что вам нужно сделать, это набрать:

 $> http-сервер
 Запуск http-сервера, обслуживающего ./public на порт: 8080
 http-сервер успешно запущен: http: // localhost: 8080
 Нажмите CTRL-C, чтобы остановить сервер

Это запустит обслуживающие файлы из каталога ./public, если он существует, или текущего рабочего каталога, если он не существует. Порт по умолчанию, используемый http-сервером, — 8080, но вы можете изменить этот и некоторые другие параметры с помощью переключателей командной строки:

  • -p, чтобы указать, какой порт слушать
  • -a сказать ему, к какому IP-адресу привязываться
  • -i, чтобы настроить, следует ли отображать autoIndex (по умолчанию true)
  • -s или –silent, чтобы отключить ведение журнала консоли
  • -h или –help для отображения этого списка доступных команд

В этой статье мы рассмотрели три статических модуля файлового сервера, доступных в Node: node-server, paperboy и http-server. Несмотря на то, что все они достигают одной и той же цели, выбор, который вы выберете, может быть связан с тем, сколько кода вы хотите написать и какой контроль вы должны осуществлять над статическим файловым сервером Node.

Конечно, вы можете решить написать свой собственный статический файловый сервер с нуля. Если вы это сделаете, вы могли бы сделать намного хуже, чем просматривать исходный код трех серверов, которые мы рассмотрели сегодня: