Node.js: diferença entre req.query [] e req.params

124

Há uma diferença entre obter QUERY_STRING argumentos por meio de req.query[myParam]e req.params.myParam? Em caso afirmativo, quando devo usar qual?

Pavindu
fonte

Respostas:

142

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.

JohnnyHK
fonte
Ah, ok, obrigado, então ambos são fornecidos pelo Express. E os dados POST que eu acesso via req.body.myParam?
1
Certo. Qual usar depende do que você está tentando fazer.
JohnnyHK
Observe também: "O acesso direto a req.body, req.params e req.query deve ser favorecido para maior clareza - a menos que você realmente aceite a entrada de cada objeto." - documentação expressa
Ryan Q
2
req.paramagora está obsoleto. Node sugere o uso de req.queryoureq.params
SaiyanGirl
3
por que desaprovar isso? e se usarmos parâmetros ou consulta e decidirmos alterá-lo para outro?
John
247

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

Expresso req.params >>

ruffrey
fonte
E se eu precisar de / hi /?
Daniel
2
dê uma olhada em req.url ou req.originalUrl ou req._originalUrl e, em seguida, divida no/
ruffrey
22

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
Deeksha Sharma
fonte
Boa explicação
Abk de
7

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)});
});
Animesh Singh
fonte
0

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.

Mile Mijatović
fonte