Node.js: різниця між req.query [] та req.params


124

Чи є різниця між отриманням QUERY_STRING аргументів через req.query[myParam]та req.params.myParam? Якщо так, коли я повинен використовувати який?

Відповіді:


143

req.paramsмістить параметри маршруту (у частині шляху URL-адреси) та req.queryмістить параметри запиту URL-адреси (після ?в URL-адресі).

Ви також req.param(name)можете шукати параметр в обох місцях (а також req.body), але цей метод тепер застарілий.


Ага, добре, спасибі, так що обидва надає Експрес. А дані POST, до яких я отримую доступ через req.body.myParam?

1
Правильно. Який використовувати, залежить від того, що ви намагаєтеся зробити.
JohnnyHK

Також зауважте: "Прямий доступ до req.body, req.params та req.query слід надавати перевагу для ясності - якщо тільки ви не по-справжньому приймаєте дані від кожного об'єкта." - експрес-документація
Ryan Q

2
req.paramзараз застаріло. Вузол пропонує використовувати req.queryабоreq.params
SaiyanGirl

3
чому це знецінено? що робити, якщо ми використовуємо парами або запит, а потім вирішимо змінити його на інший?
Джон

248

З огляду на цей маршрут

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

і вказав цю URL-адресу http://www.google.com/hi/there?qs1=you&qs2=tube

Ви будете мати:

req запит

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

req парами

{
  param1: 'there'
}

Експрес-відповідні параметри >>


Що робити, якщо мені потрібно отримати / привіт /?
Даніель

2
подивіться на req.url або req.originalUrl або req._originalUrl, а потім розділіться на/
ruffrey

22

Припустимо, ви вказали назву маршруту так:

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

що стане:

https://localhost:3000/user/5896544

Ось, якщо ви надрукуєте: request.params

{
userId : 5896544
}

так

request.params.userId = 5896544

so request.params - об'єкт, що містить властивості зазначеного маршруту

і request.query надходить із параметрів запиту в URL-адресі, наприклад:

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

request.query

{

userId: 5896544

}

так

request.query.userId = 5896544

Гарне пояснення
АБК

7

Ви повинні мати можливість отримати доступ до запиту, використовуючи нотацію точок.

Якщо ви хочете отримати доступ, скажіть, що ви отримуєте GET- запит на, /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXі ви хочете отримати використаний запит .

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

Параметри використовуються для самостійно визначеного параметра для отримання запиту, наприклад (наприклад):

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

Хочу зазначити одне важливе зауваження щодо того req.query, що зараз я працюю над функцією пагинації на основі, req.queryі я маю один цікавий приклад, який вам продемонструю ...

Приклад:

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

Ви помітите +знак перед req.query.pageSizeіreq.query.currentPage

Чому? Якщо ви видалите +в цьому випадку, ви отримаєте помилку, і ця помилка буде викинута, оскільки ми будемо використовувати неправильний тип (при повідомленні про помилку поле 'limit' має бути числовим).

Важливо : Якщо ви виймаєте щось із цих параметрів запиту, за замовчуванням це завжди буде рядок , оскільки він надходить з URL-адресою і розглядається як текст.

Якщо нам потрібно працювати з числами та перетворювати заяви запиту з тексту в число, ми можемо просто додати знак плюс перед оператором.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.