Node.js: Différence entre req.query [] et req.params

124

Y a-t-il une différence entre l'obtention d'arguments QUERY_STRING via req.query[myParam]et req.params.myParam? Si oui, quand dois-je utiliser lequel?

Pavindu
la source

Réponses:

143

req.paramscontient les paramètres de route (dans la partie chemin de l'URL) et req.querycontient les paramètres de requête d'URL (après le ?dans l'URL).

Vous pouvez également utiliser req.param(name)pour rechercher un paramètre aux deux endroits (ainsi que req.body), mais cette méthode est désormais obsolète.

JohnnyHK
la source
Ah, ok, merci, donc les deux sont fournis par Express. Et les données POST auxquelles j'accède via req.body.myParam?
1
Droite. Lequel utiliser dépend de ce que vous essayez de faire.
JohnnyHK
Remarquez également: «L'accès direct à req.body, req.params et req.query doit être privilégié pour plus de clarté - à moins que vous n'acceptiez vraiment l'entrée de chaque objet.» - documentation express
Ryan Q
2
req.paramest désormais obsolète. Node suggère d'utiliser req.queryoureq.params
SaiyanGirl
3
pourquoi le désapprouver? et si nous utilisons des paramètres ou une requête et décidons ensuite de le changer en un autre?
John
248

Compte tenu de cet itinéraire

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

et étant donné cette URL http://www.google.com/hi/there?qs1=you&qs2=tube

Tu vas avoir:

req. requete

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

req. paramètres

{
  param1: 'there'
}

Paramètres de demande express >>

Ruffrey
la source
Et si j'ai besoin d'obtenir / hi /?
daniel
2
jetez un oeil à req.url ou req.originalUrl ou req._originalUrl, puis /
scindez
23

Supposons que vous ayez défini le nom de votre itinéraire comme ceci:

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

qui deviendra:

https://localhost:3000/user/5896544

Ici, si vous imprimez: request.params

{
userId : 5896544
}

alors

request.params.userId = 5896544

donc request.params est un objet contenant les propriétés de la route nommée

et request.query provient des paramètres de requête dans l'URL, par exemple:

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

request.query

{

userId: 5896544

}

alors

request.query.userId = 5896544
Deeksha Sharma
la source
Bonne explication
Abk
7

Vous devriez pouvoir accéder à la requête en utilisant la notation par points maintenant.

Si vous souhaitez accéder, dites que vous recevez une requête GET à /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXet que vous souhaitez récupérer la requête utilisée.

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

Les paramètres sont utilisés pour le paramètre auto-défini pour la réception de la demande, quelque chose comme (exemple):

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
la source
0

Je tiens à mentionner une note importante concernant req.query, car actuellement je travaille sur la fonctionnalité de pagination basée sur req.queryet j'ai un exemple intéressant à vous montrer ...

Exemple:

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

Vous remarquerez un +signe devant req.query.pageSizeetreq.query.currentPage

Pourquoi? Si vous supprimez +dans ce cas, vous obtiendrez une erreur, et cette erreur sera renvoyée car nous utiliserons un type non valide (avec un message d'erreur, le champ «limite» doit être numérique).

Important : par défaut, si vous extrayez quelque chose à partir de ces paramètres de requête, ce sera toujours une chaîne , car elle provient de l'URL et elle est traitée comme un texte.

Si nous devons travailler avec des nombres et convertir des instructions de requête de texte en nombre, nous pouvons simplement ajouter un signe plus devant l'instruction.

Mile Mijatović
la source