Node.js: różnica między req.query [] i req.params


124

Czy istnieje różnica między uzyskiwaniem argumentów QUERY_STRING za pośrednictwem req.query[myParam]i req.params.myParam? Jeśli tak, kiedy należy użyć których?

Odpowiedzi:


142

req.paramszawiera parametry trasy (w części adresu URL będącej ścieżką) i req.queryzawiera parametry zapytania URL (po znaku ?w adresie URL).

Możesz również użyć req.param(name)do wyszukania parametru w obu miejscach (a także req.body), ale ta metoda jest teraz przestarzała.


Ach, ok, dzięki, więc oba są dostarczane przez Express. A dane POST, do których mam dostęp przez req.body.myParam?

1
Dobrze. To, którego użyć, zależy od tego, co próbujesz zrobić.
JohnnyHK

Uwaga: „Bezpośredni dostęp do req.body, req.params i req.query powinien być preferowany ze względu na przejrzystość - chyba że naprawdę akceptujesz dane wejściowe z każdego obiektu”. - dokumentacja ekspresowa
Ryan Q

2
req.paramjest teraz przestarzała. Node sugeruje użycie req.querylubreq.params
SaiyanGirl

3
po co go wycofywać? co się stanie, jeśli użyjemy parametrów lub zapytania, a następnie zdecydujemy się zmienić je na inne?
Jan

247

Biorąc pod uwagę tę trasę

app.get('/hi/:param1', function(req,res){} );

i mając ten adres URL http://www.google.com/hi/there?qs1=you&qs2=tube

Będziesz miał:

req. pytanie

{
  qs1: 'you',
  qs2: 'tube'
}

req. params

{
  param1: 'there'
}

Express req. Parametry >>


A jeśli potrzebuję / hi /?
daniel

2
spójrz na req.url lub req.originalUrl lub req._originalUrl, a następnie podziel się na/
ruffrey

22

Załóżmy, że zdefiniowałeś nazwę swojej trasy w następujący sposób:

https://localhost:3000/user/:userid

który stanie się:

https://localhost:3000/user/5896544

Tutaj, jeśli wydrukujesz: request.params

{
userId : 5896544
}

więc

request.params.userId = 5896544

więc request.params jest obiektem zawierającym właściwości podanej trasy

i request.query pochodzi z parametrów zapytania w adresie URL, np .:

https://localhost:3000/user?userId=5896544 

request.query

{

userId: 5896544

}

więc

request.query.userId = 5896544

Dobre wyjaśnienie
Abk

7

Powinieneś być teraz w stanie uzyskać dostęp do zapytania przy użyciu notacji kropkowej.

Jeśli chcesz uzyskać dostęp, powiedz, że otrzymujesz żądanie GET pod adresem /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXi chcesz pobrać użyte zapytanie .

var type = req.query.type,
    email = req.query.email,
    utm = {
     source: req.query.utm_source,
     campaign: req.query.utm_campaign
    };

Parametry są używane dla zdefiniowanego przez siebie parametru do odbierania żądania, na przykład (przykład):

router.get('/:userID/food/edit/:foodID', function(req, res){
 //sample GET request at '/xavg234/food/edit/jb3552'

 var userToFind = req.params.userID;//gets xavg234
 var foodToSearch = req.params.foodID;//gets jb3552
 User.findOne({'userid':userToFind}) //dummy code
     .then(function(user){...})
     .catch(function(err){console.log(err)});
});

0

Chciałbym wspomnieć o jednej ważnej uwadze dotyczącej req.query, ponieważ obecnie pracuję nad funkcjonalnością paginacji w oparciu o req.queryi mam jeden ciekawy przykład do zademonstrowania ...

Przykład:

// Fetching patients from the database
exports.getPatients = (req, res, next) => {

const pageSize = +req.query.pageSize;
const currentPage = +req.query.currentPage;

const patientQuery = Patient.find();
let fetchedPatients;

// If pageSize and currentPage are not undefined (if they are both set and contain valid values)
if(pageSize && currentPage) {
    /**
     * Construct two different queries 
     * - Fetch all patients 
     * - Adjusted one to only fetch a selected slice of patients for a given page
     */
    patientQuery
        /**
         * This means I will not retrieve all patients I find, but I will skip the first "n" patients
         * For example, if I am on page 2, then I want to skip all patients that were displayed on page 1,
         * 
         * Another example: if I am displaying 7 patients per page , I want to skip 7 items because I am on page 2,
         * so I want to skip (7 * (2 - 1)) => 7 items
         */
        .skip(pageSize * (currentPage - 1))

        /**
         * Narrow dont the amound documents I retreive for the current page
         * Limits the amount of returned documents
         * 
         * For example: If I got 7 items per page, then I want to limit the query to only
         * return 7 items. 
         */
        .limit(pageSize);
}
patientQuery.then(documents => {
    res.status(200).json({
        message: 'Patients fetched successfully',
        patients: documents
    });
  });
};

Zauważysz +znak przed req.query.pageSizeireq.query.currentPage

Czemu? Jeśli usuniesz +w tym przypadku, pojawi się błąd, który zostanie wyrzucony, ponieważ użyjemy nieprawidłowego typu (z komunikatem o błędzie pole „limit” musi być numeryczne).

Ważne : Domyślnie, jeśli wyodrębniasz coś z tych parametrów zapytania, zawsze będzie to ciąg znaków , ponieważ pochodzi z adresu URL i jest traktowany jako tekst.

Jeśli musimy pracować z liczbami i konwertować zapytania z tekstu na liczbę, możemy po prostu dodać znak plus przed instrukcją.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.