Как работает объект res в Express

В этом мануале мы поговорим об объекте res в Express. res (сокращение от response) – это половина цикла request/response, который отвечает за отправку данных с сервера на клиентскую сторону через HTTP-запросы.

Читайте также: Как работает объект req в Express

Требования

Методы .status() и .append()

Метод .send() объекта res пересылает клиентской стороне любые данные, переданные в качестве аргумента. Метод может принимать в качестве аргумента строку, массив и объект.

Откройте файл index.js и реализуйте запрос GET с маршрутом ‘/home’:

app.get('/home', (req, res) => {
  res.send('Hello World!'))
});

Обратите внимание, GET-запрос принимает callback аргумент с req и res в качестве аргументов. Вы можете использовать объект res в GET-запросе, чтобы отправить клиенту строку «Hello World!».

Метод .send() также изначально определяет собственные встроенные заголовки в зависимости от Content-Type и Content-Length данных.

Объект res может определять HTTP-коды состояния. Это делается с помощью метода .status(). В файле index.js интегрируйте метод .status() в объект res и передайте код состояния в качестве аргумента:

res.status(404).send('Not Found');

Метод .status() объекта res установит код состояния 404. Чтобы отправить код состояния на клиентскую сторону, вы можете использовать цепочку методов с помощью .send(). Код состояния 404 сообщает клиентской стороне, что запрошенные данные не найдены.

Метод .sendStatus() – это сокращенный синтаксис, который обеспечивает функциональность методов .status() и .send():

res.sendStatus(404);

Здесь метод .sendStatus() устанавливает код состояния 404 и отправляет его клиентской стороне – все это за один вызов.

Коды состояния HTTP обобщают ответ вашего сервера Express. Браузеры используют эти коды, чтобы сообщить клиентской стороне, существуют ли указанные данные и не возникает ли внутренних ошибок сервера.

Чтобы определить заголовок в ответе сервера, примените метод .append(). В вашем файле index.js при вызове .append() передайте заголовок в качестве первого аргумента и значение в качестве второго:

res.append('Content-Type', 'application/javascript; charset=UTF-8');
res.append('Connection', 'keep-alive')
res.append('Set-Cookie', 'divehours=fornightly')
res.append('Content-Length', '5089990');

В рамках одной строки кода метод .append() принимает стандартные и нестандартные заголовки в ответе вашего сервера.

Анализ методов .redirect(), .render() и .end()

Метод redirect() объекта res перенаправит клиентскую сторону на другую страницу. Если пользователь вводит свои учетные данные на стороне клиента, метод .redirect() упростит переключение на его страницу доступа.

Вернемся к нашему файлу index.js. Установите в нем метод .redirect() для объекта res:

res.redirect('/sharks/shark-facts')

В данном случае метод .redirect() перенаправит клиентскую сторону по маршруту ‘/sharks/shark-facts’.

Метод .render() принимает HTML-файл в качестве аргумента и отправляет его клиентской стороне. Опционально он также принимает второй аргумент, локальный объект с пользовательскими свойствами для определения файла, отправляемого на клиентскую сторону.

Вернитесь в index.js и реализуйте в нем GET-запрос с маршрутом ‘/shark-game’:

app.get('/shark-game', (req, res) => {
  res.render('shark.html', {status: 'good'});
});

Метод .render() в объекте res отправит на сторону клиента HTML-файл shark.html и локальный объект со свойством status.

Метод .end() завершит цикл ответа. Рекомендуется использовать метод .end() в качестве последнего вызова в ответе на стороне клиента.

Откройте файл index.js и установите метод .sentStatus(), связанный с методом .end():

res.sendStatus(404).end();

Метод .end() завершит ответ после установки кода состояния 404 и отправит его на сторону клиента.

Объект req упрощает передачу не только данных, но и файлов. Давайте посмотрим на методы, с помощью которых объект req управляет файлами.

Работа с файлами с помощью объекта res

Чтобы отправить файлы HTML, CSS и JavaScript на клиентскую сторону, используйте метод .sendFile() объекта res. В файле index.js установите GET-запрос для маршрута ‘/gallery/:fileName’:

// GET https://sharks.com/gallery/shark-image.jpg

app.get('/gallery/:fileName', function (req, res, next) {

  var options = {
    root: path.join(__dirname, 'public')
  };

  res.sendFile(req.params.fileName, options, function (err) {
    if (err) next(err);
    else console.log('Sent:', fileName);
  });
});

В GET-запросе при вызове path.join() переменная options принимает в качестве значения объект и каталог public, чтобы служить абсолютным путем. Каталог public содержит файлы HTML, CSS и JavaScript. Метод call .sendFile принимает переменную options в качестве второго аргумента и устанавливает обработчик ошибок в качестве третьего. Это отправит файлы, хранящиеся в каталоге public, на сторону клиента.

Вы также можете упростить обработку файлов с помощью метода .download() объекта res. Реализуйте в файле index.js GET-запрос к маршруту ‘/gallery/:fileName’:

// GET https://sharkss.com/gallery/shark-image.jpg

app.get('/gallery/:fileName', function(req, res){
  const file = `${__dirname}/public/${req.params.fileName}`;
  res.download(file);
});

Метод .download() отправляет файл и предлагает клиентской стороне загрузить его, а также устанавливает соответствующие заголовки для типа файла за один вызов.

Чтобы указать значение Content-Header для типа файла, используйте метод .type() объекта res. Установите в index.js метод .type() для объекта res и передайте тип файла как аргумент:

res.type('png')              // => 'image/png'
res.type('html')             // => 'text/html'
res.type('application/json') // =>'application/json'

Метод .type() выведет тип файла со связанными с ним значениями в Content-Header.

Заключение

Объект res содержит методы для облегчения передачи данных и файлов в рамках цикла ответа (от сервера Express к клиентской стороне). Чтобы получить более подробную информацию об объекте res, посетите официальный сайт Express.js.

Tags: ,

Добавить комментарий