Získejte řetězce dotazů a parametry v Express.js

Úvod

Probereme, jak extrahovat informace z adresy URL v Express.js. Konkrétně, jak extrahujeme informace z řetězce dotazu a jak extrahujeme informace z parametrů cesty URL?

V tomto článku předpokládám, že máte nějaké zkušenosti s Node.js a vytvářením Express.js serverů (nebo alespoň těch jednoduchých). Zbytek vysvětlíme v celém článku.

Extrahování parametrů dotazu

Než začneme, bylo by užitečné nejprve porozumět tomu, co přesně je řetězec/parametr dotazu, a poté si promluvíme o tom, jak s nimi můžeme pracovat.

Takže co je parametr dotazu ?

Jednoduše řečeno, řetězec dotazu je součástí adresy URL (Uniform Resource Locater) po otazník (?). Je určen k odesílání malého množství informací na server prostřednictvím adresy URL. Tyto informace se obvykle používají jako parametry k dotazování databáze nebo možná k filtrování výsledků. Je opravdu na vás, k čemu se použijí.

Zde je příklad adresy URL s připojenými řetězci dotazu:

https://stackabuse.com/?page=2&limit=3

Parametry dotazu jsou skutečné páry klíč–hodnota jako page a limit s hodnotami 2 a 3 , respektive.

Nyní přejděme k prvnímu hlavnímu účelu tohoto článku – jak je extrahovat z našeho objektu expresního požadavku .

Toto je docela běžný případ použití v Express a jakémkoli HTTP serveru, takže doufejme, že příklady a vysvětlení, které zde uvádím, jsou jasné.

Vezměme nyní stejný příklad z výše uvedeného:

https://stackabuse.com/?page=2&limit=3

Rádi bychom extrahovali oba page a limit parametry, abychom věděli, které články se vrátit na stránku, kterou uživatel požadoval. Zatímco parametry dotazu se obvykle používají v GET požadavky, je stále možné je vidět v POST a DELETE mimo jiné.

Parametry vašeho dotazu lze získat z query objekt na objekt požadavku zaslaný na vaši trasu. Je ve formě objektu, ve kterém můžete přímo přistupovat k parametrům dotazu, na kterých vám záleží. V tomto případě Express zpracovává veškerou analýzu URL za vás a vystavuje načtené parametry jako tento objekt.

Podívejme se na příklad získávání parametrů dotazu v trase:

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')
});

Ve výše uvedeném příkladu předpokládáme page a limit parametry vždy existují. Pokud v adrese URL není uveden žádný z těchto parametrů, obdržíme undefined pro oba page a limit místo toho.

Extrahovat parametry dotazu bez expresního

Jako rychlý bonus jsem vám chtěl ukázat, jak provést vlastní analýzu v případě, že potřebujete extrahovat informace z adresy URL, která nepoužívá Express nebo jakýkoli jiný webový rámec. Je poměrně běžné vytvořit zcela jednoduchý server pomocí http modul, takže je dobré to vědět.

Naštěstí pro vás Node.js již poskytuje několik skvělých základních knihoven, které mají tuto funkci vestavěnou, takže je to jen otázka require -spuštění modulu a vyvolání několika řádků kódu.

Zde je příklad použití balíčků querystring a 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' }

V tomto kódu můžete vidět, že potřebujeme dva kroky analýzy, abychom získali požadované výsledky.

Zdarma e-kniha:Git Essentials

Prohlédněte si našeho praktického průvodce učením Git s osvědčenými postupy, průmyslově uznávanými standardy a přiloženým cheat sheetem. Přestaňte používat příkazy Google Git a skutečně se naučte to!

Pojďme si to rozebrat trochu dále a ukázat, co přesně se děje na každém kroku. Po zavolání url.parse(rawUrl) na naší adrese URL se nám vrátí toto:

{
    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'
}

Dobře, jsme o něco blíž, abychom získali data, která potřebujeme. Ale je potřeba to rozebrat ještě jednou. Můžeme to udělat pomocí querystring balíček pro analýzu skutečného řetězce dotazu. Například:

let parsedQs = querystring.parse(parsedUrl.query);

A nakonec naše parsedQs objekt obsahuje následující:

{
    page: '2',
    limit: '3'
}

Extrahování parametrů trasy

V jakékoli webové aplikaci je dalším běžným způsobem strukturování adres URL umístění informací do skutečné cesty adresy URL, které se v Express jednoduše nazývají parametry trasy. Můžeme je použít ke strukturování webových stránek podle informací/dat, což jsou zvláště užitečné v REST API.

Extrahování těchto parametrů trasy je podobné jako u parametrů dotazu. Jediné, co uděláme, je vzít req objekt a načtěte naše parametry z params objekt. Docela jednoduché, že?

Podívejme se na příklad, jak to udělat na naší expresní trase:

// 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
    });
});

První věc, které je třeba si všimnout, je, že říkáme Expressu, že naše trasa je /tag/:id , kde :id je zástupný symbol pro cokoli. Může to být řetězec nebo číslo. Takže vše, co je předáno v této části cesty, je nastaveno jako id parametr.

Pokud bychom měli přejít na adresu URL https://stackabuse.com/tag/node pak id bude node a dostali bychom spoustu článků, které mají node tag na nich. A req.params v tomto případě by to bylo {id: 'node'} , stejně jako query objekt.

Jak můžete vidět, opět pouze přebíráme náš parametr přímo z objektu obsaženého v objektu požadavku.

Závěr

V tomto článku jsem představil způsoby, jak extrahovat jak parametry řetězce dotazu, tak parametry cesty cesty URL ve webovém frameworku Express. Zde je rychlá rekapitulace toho, jak extrahovat parametry, o kterých jsme mluvili:

  • req.query :přímý přístup k parametrům analyzovaného řetězce dotazu
  • req.params :přímý přístup k analyzovaným parametrům trasy z cesty

Zatímco samotné získávání těchto dat je velmi jednoduché, pochopení, odkud tyto informace pocházejí a co to je, může být pro některé začátečníky matoucí. Snad vám tento článek některé věci objasnil. Pokud je něco nejasného, ​​dejte nám vědět v komentářích.