Есть ли разница между получением аргументов QUERY_STRING через req.query[myParam]
и req.params.myParam
? Если да, то когда я должен использовать что?
Node.js: Разница между req.query [] и req.params
Ответ 1
req.params
содержит параметры маршрута (в части пути URL) и req.query
содержит параметры запроса URL (после ?
в URL-адресе).
Вы также можете использовать req.param(name)
для поиска параметра в обоих местах (а также req.body
), но этот метод теперь не рекомендуется.
Ответ 2
Учитывая этот маршрут
app.get('/hi/:param1', function(req,res){} );
и с учетом этого URL-адреса http://www.google.com/hi/there?qs1=you&qs2=tube
У вас будет:
REQ. запрос
{
qs1: 'you',
qs2: 'tube'
}
REQ. PARAMS
{
param1: 'there'
}
Ответ 3
Предположим, вы определили название вашего маршрута следующим образом:
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
Ответ 4
Теперь вы можете получить доступ к запросу с использованием точечной нотации.
Если вы хотите получить доступ, скажите, что вы получаете запрос 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)});
});
Ответ 5
Я хочу упомянуть одно важное замечание относительно 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.pageSize
и req.query.currentPage
Зачем? Если вы удалите +
в этом случае, вы получите ошибку, и эта ошибка будет сгенерирована, потому что мы будем использовать недопустимый тип (с сообщением об ошибке поле "limit" должно быть числовым).
Важное замечание: По умолчанию, если вы извлекаете что-то из этих параметров запроса, это всегда будет строка, потому что она идет по URL и обрабатывается как текст.
Если нам нужно работать с числами и преобразовывать операторы запроса из текста в число, мы можем просто добавить знак плюс перед оператором.