Respostas:
req.paramscontém parâmetros de rota (na parte do caminho do URL) e req.querycontém os parâmetros de consulta de URL (depois de ?no URL).
Você também pode usar req.param(name)para pesquisar um parâmetro em ambos os lugares (bem como req.body), mas este método agora está obsoleto.
req.paramagora está obsoleto. Node sugere o uso de req.queryoureq.params
Dada esta rota
app.get('/hi/:param1', function(req,res){} );
e dado este URL
http://www.google.com/hi/there?qs1=you&qs2=tube
Voce terá:
req. inquerir
{
qs1: 'you',
qs2: 'tube'
}
req. params
{
param1: 'there'
}
/
Suponha que você tenha definido o nome do seu trajeto assim:
https://localhost:3000/user/:userid
que se tornará:
https://localhost:3000/user/5896544
Aqui, se você imprimir: request.params
{
userId : 5896544
}
tão
request.params.userId = 5896544
portanto, request.params é um objeto que contém propriedades para a rota nomeada
e request.query vem de parâmetros de consulta no URL, por exemplo:
https://localhost:3000/user?userId=5896544
request.query
{
userId: 5896544
}
tão
request.query.userId = 5896544
Você deve conseguir acessar a consulta usando a notação de ponto agora.
Se deseja acessar, diga que está recebendo uma solicitação GET em /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXe deseja buscar a consulta usada.
var type = req.query.type,
email = req.query.email,
utm = {
source: req.query.utm_source,
campaign: req.query.utm_campaign
};
Os parâmetros são usados para o parâmetro autodefinido para receber solicitação, algo como (exemplo):
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)});
});
Quero mencionar uma observação importante a respeito req.query, porque atualmente estou trabalhando na funcionalidade de paginação baseada em req.querye tenho um exemplo interessante para demonstrar a vocês ...
Exemplo:
// 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
});
});
};
Você notará um +sinal na frente de req.query.pageSizeereq.query.currentPage
Por quê? Se você deletar+ neste caso, obterá um erro, e esse erro será gerado porque usaremos um tipo inválido (com a mensagem de erro o campo 'limite' deve ser numérico).
Importante : Por padrão, se você extrair algo desses parâmetros de consulta, sempre será uma string , pois vem da URL e é tratada como um texto.
Se precisarmos trabalhar com números e converter instruções de consulta de texto em número, podemos simplesmente adicionar um sinal de mais na frente da instrução.