Вступление
Мы рассмотрим, как извлечь информацию из URL-адреса в Express.js. В частности, как мы извлекаем информацию из строки запроса и как извлекаем информацию из параметров пути URL?
В этой статье я предполагаю, что у вас есть некоторый опыт работы с Node.js и создания серверов Express.js (или, по крайней мере, простых). Остальное мы объясним в статье.
Извлечение параметров запроса
Прежде чем мы начнем, было бы полезно сначала понять, что такое строка / параметр запроса, а затем мы поговорим о том, как с ними работать.
Итак, что такое параметр запроса ?
Проще говоря, строка запроса - это часть URL-адреса (Uniform Resource Locater) после вопросительного знака (?). Он предназначен для отправки небольшого количества информации на сервер через URL-адрес. Эта информация обычно используется в качестве параметров для запроса к базе данных или, возможно, для фильтрации результатов. Вам действительно решать, для чего они используются.
Вот пример URL-адреса с прикрепленными строками запроса:
https://stackabuse.com/?page=2&limit=3
Параметры запроса представляют собой фактические пары ключ-значение ,
как page
и limit
со значениями 2
и 3
, соответственно.
Теперь перейдем к первой основной цели этой статьи - как извлечь их из нашего объекта экспресс-запроса .
Это довольно распространенный вариант использования в Express и на любом HTTP-сервере, поэтому, надеюсь, приведенные здесь примеры и объяснения понятны.
Теперь возьмем тот же пример сверху:
https://stackabuse.com/?page=2&limit=3
Мы хотели бы извлечь параметры page
и limit
чтобы знать, какие
статьи возвращать на страницу, запрошенную пользователем. Хотя параметры
запроса обычно используются в GET
, их все еще можно увидеть в POST
и DELETE
, среди прочего.
Параметры запроса можно получить из объекта query
объекте
запроса, отправленном на ваш
маршрут. Он находится в форме объекта, в котором вы можете напрямую
обращаться к интересующим вас параметрам запроса. В этом случае Express
обрабатывает весь синтаксический анализ URL за вас и предоставляет
извлеченные параметры как этот объект.
Давайте посмотрим на пример получения нами параметров запроса в маршруте:
const express = require('express');
const bodyParser = require('body-parser');
const url = require('url');
const querystring = require('querystring');
const Article = require('./models').Article;
let app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// Function to handle the root path
app.get('/', async function(req, res) {
// Access the provided 'page' and 'limt' query parameters
let page = req.query.page;
let limit = req.query.limit;
let articles = await Article.findAll().paginate({page: page, limit: limit}).exec();
// Return the articles to the rendering engine
res.render('index', {
articles: articles
});
});
let server = app.listen(8080, function() {
console.log('Server is listening on port 8080')
});
В приведенном выше примере мы предполагаем, что параметры page
и
limit
всегда существуют. Если ни один из этих параметров не указан в
URL-адресе, вместо этого undefined
для page
и limit
Извлечь параметры запроса без Express
В качестве быстрого бонуса я хотел показать вам, как выполнить
фактический синтаксический анализ самостоятельно, если вам нужно извлечь
информацию из URL-адреса, который не использует Express или любую другую
веб-платформу. Довольно распространено создание чрезвычайно простого
сервера с использованием http
, так что это полезно знать.
К счастью для вас, Node.js уже предоставляют некоторые большие основные
библиотеки , которые имеют эту функциональность встроенную, так что это
просто вопрос require
-ную модуль и вызов несколько строк коды.
Вот пример использования пакетов querystring и url.
const url = require('url');
const querystring = require('querystring');
let rawUrl = 'https://stackabuse.com/?page=2&limit=3';
let parsedUrl = url.parse(rawUrl);
let parsedQs = querystring.parse(parsedUrl.query);
// parsedQs = { page: '2', limit: '3' }
Вы можете видеть в этом коде, что нам требуется два шага синтаксического анализа, чтобы получить желаемые результаты.
Давайте разберемся немного дальше и покажем, что именно происходит на
каждом этапе. После вызова url.parse(rawUrl)
для нашего URL-адреса нам
возвращается следующее:
{
protocol: 'https:',
slashes: true,
auth: null,
host: 'stackabuse.com',
port: null,
hostname: 'stackabuse.com',
hash: null,
search: '?page=2&limit=3',
query: 'page=2&limit=3',
pathname: '/',
path: '/?page=2&limit=3',
href: 'https://stackabuse.com/?page=2&limit=3'
}
Хорошо, мы немного приблизились к получению необходимых данных. Но это
нужно еще раз разбить. Мы можем сделать это, используя querystring
для
анализа фактической строки запроса. Например:
let parsedQs = querystring.parse(parsedUrl.query);
И, наконец, наш parsedQs
содержит следующее:
{
page: '2',
limit: '3'
}
Извлечение параметров маршрута
В любом веб-приложении еще одним распространенным способом структурирования URL-адресов является размещение информации внутри фактического пути URL-адреса, который в Express просто называется параметрами маршрута. Мы можем использовать их для структурирования веб-страниц по информации / данным, что особенно полезно в REST API.
Извлечение этих параметров маршрута аналогично параметрам запроса. Все,
что мы делаем, это берем req
и получаем наши параметры из объекта
params
Довольно просто, правда?
Давайте посмотрим на пример этого в нашем экспресс-маршруте:
// Route to return all articles with a given tag
app.get('/tag/:id', async function(req, res) {
// Retrieve the tag from our URL path
var id = req.params.id;
let articles = await Article.findAll({tag: id}).exec();
res.render('tag', {
articles: articles
});
});
Первое, на что следует обратить внимание, это то, что мы сообщаем
Express, что наш маршрут - это /tag/:id
, где :id
- это заполнитель
для чего угодно. Это может быть строка или число. Таким образом, все,
что передается в этой части пути, устанавливается как параметр id
Если бы нам нужно было перейти по URL-адресу
https://stackabuse.com/tag/node
тогда id
был бы node
, и мы
получили бы кучу статей с node
на них. И req.params
в этом случае
будет {id: 'node'}
, как и объект query
Как видите, мы снова просто берем наш параметр непосредственно из объекта, содержащегося в объекте запроса.
Заключение
В этой статье я представил способы извлечения как параметров строки запроса, так и параметров пути маршрута URL-адреса в веб-платформе Express. Вот краткое описание того, как извлечь параметры, о которых мы говорили:
req.query
: прямой доступ к параметрам проанализированной строки запросаreq.params
: прямой доступ к анализируемым параметрам маршрута из пути
Хотя на самом деле процесс получения этих данных очень прост, понимание того, откуда эта информация и что это за информация, может сбивать с толку некоторых новичков. Надеюсь, эта статья прояснила для вас некоторые вещи. Не стесняйтесь сообщить нам в комментариях, если что-то неясно.