Многие уже не воспринимают node.js без этого модуля. Он здорово упрощает рутинные операции по созданию сервера, работе с запросами и всякой маршрутизацией.

Страница на

github, страница на nodejsmodules, сайт проекта.

Запрос

Простейший код для создания сервера, отдающего «hello» на запрос корня:

var http = require('http');
var express = require('express');
var app = express();
app.use(express.bodyParser());

app.get('/', function (req, res) {
    res.end('hello!');
});

app.listen(19880);

Все функции библиотеки возвращают обратно объект app, поэтому их можно цепочить:

app.get('/', function (req, res) { res.end('hello!'); }).listen(19880);

Чтобы ответить на POST-запрос, просто используйте app.post(‘/’, function (req, res) {}); Для ответа на запрос конкретного пути используйте

app.get('/index.htm') - реагирует на запрос site/index.htm
app.get('/files/file.htm') - реагирует на запрос site/files/file.htm

Переменные пути

app.get('/:file') - реагирует на запрос любой страницы из корня
app.get('/:folder/:file') - реагирует на запрос любой страницы из любой папки
app.get('/files/:file') - реагирует на запрос любой страницы из папки files

Запрос попадает в переменную req. Все переменные доступны как «req.params.имя_переменной», например в приведённом примере можно получить значения req.params.file, req.params.folder. Конечно, это нужно использовать с умом — допустим, сначала поставить в очередь обработки (разместить выше) функцию, реагирующую на «/», потом «/index.htm», и уже потом «/:file», поскольку весь перечень обработчиков обходятся последовательно, и обход прекращается при достижении подходящего обработчика.

Параметры клиента

Доступны некоторые параметры вроде IP юзера (req.ip), URL страницы (req.path), протокол (req.protocol).

Данные запроса

При запросе пути вроде /index.htm?a=5&long_variable_name=7 значения переменных попадают в req.query.a и req.query.long_variable_name соответственно.

Ответ сервера

Это поле деятельности переменной res. res.send или res.end отправляют ответ сервера — код ответа и текст страницы. Любое из полей может быть пропущено, допустим res.send(‘hello’); отправит страницу с текстом hello и код 200, а res.send(404); отправит код ошибки 404. Также можно отправлять массивы и объекты, тогда send преобразует их в json-строки.

Передача файлов

Очевидно, так можно отправлять и файлы в бинарном виде, только сначала надо их загрузить с помощью библиотеки fs. Чтобы сообщить клиенту тип передаваемого файла, служит функция res.type(), например res.type(‘html’) для html-кода (по умолчанию), или res.type(‘png’) для PNG-картинки (используйте PNG в своих проектах!)

На самом деле, куда проще отправлять файл командой res.attachment(‘путь_к_файлу’) или её расширенным вариантом res.sendfile(‘путь_к_файлу’, [options], function (err) {}). Но это для «нескачиваемых» файлов — элементов вёрстки, js-кода или css-файлов, картинок.

Передача загружаемых файлов

Очень легко можно осуществить передачу «скачиваемого» файла, т.е. такого который вызовет появление у юзера окошка «Загрузить файл».

res.download('/archive.zip', 'file_on_disk.zip', function(err){
  if (!err) { downloads_remaining_count--; }
});

Вот мы и сделали файлохостинг с ограниченным количеством загрузок файлов :)

Загрузка файлов

Чтобы дать юзеру возможность загружать к вам файлы, сделайте следующее. Отдайте ему методом GET страницу с кодом

<form method="post" enctype="multipart/form-data">
    File: <input type="file" name="downloaded_file" multiple="multiple">
    <input type="submit" value="Upload">
</form>

В обработчике POST этой страницы вы получите переменную req.files.downloaded_file. Если было загружено несколько файлов, то это массив объектов (с параметром length = количество файлов), если был загружен один файл — это объект. В каждом объекте будет записан путь к нему. Кстати, папку для сохранения временных файлов можно задать в самом начале кода, при создании объекта app — передайте методу bodyParser соответствующий параметр:

express.bodyParser({ uploadDir: 'photos' }));

Подключаемые модули express.js

Мы обошли вниманием строку app.use(express.bodyParser()) при инициализации модуля, а она между прочим очень важна. Функция use — это интерфейс подключения дополнительных модулей к express.js. bodyParser — это мета-модуль, объединяющий модули json, urlencoded и multipart. Все их можно подключать по отдельности, и передавать им какие-то параметры. Существует ещё несколько модулей, самые полезные — logger и compress, которые включает gzip-сжатие страниц.