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), но этот метод теперь устарел.


Ах, хорошо, спасибо, оба предоставлены Express. И данные 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

так что request.params - это объект, содержащий свойства для именованного маршрута

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

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

request.query

{

userId: 5896544

}

так

request.query.userId = 5896544

Хорошее объяснение
Abk

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

Params используются для самоопределяемого параметра для получения запроса, например (пример):

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.