web-dev-qa-db-fra.com

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

Existe-t-il une différence entre obtenir les arguments QUERY_STRING via req.query [myParam] et req.params.myParam? Si oui, quand devrais-je utiliser lequel?

Merci.

95
user1598019

req.params contient les paramètres de route (dans la partie chemin de l'URL) et req.query contient 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 emplacements (ainsi que _req.body_), mais cette méthode est désormais obsolète.

107
JohnnyHK

Compte tenu de cette route

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:

demande requête

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

demande params

{
  param1: 'there'
}

Express req.params >>

212
ruffrey

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

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

qui deviendra:

https://localhost:3000/user/5896544

Ici, si vous voulez imprimer: request.params

{
userId : 5896544
}

alors

request.params.userId = 5896544

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

et request.query provient de 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

8
Deeksha Sharma

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

Si vous voulez y accéder, disons que vous recevez une demande GET sur /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XX et que vous voulez extraire la requête utilisé.

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

Params sont utilisés pour le paramètre défini par l'utilisateur pour la demande de réception, 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)});
});
7
Animesh Singh

Je souhaite mentionner une note importante concernant req.query, car je travaille actuellement sur une fonctionnalité de pagination basée sur req.query et 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 le signe + devant req.query.pageSize et req.query.currentPage

Pourquoi? Si vous supprimez + dans ce cas, vous obtiendrez une erreur. Cette erreur sera générée car nous utiliserons un type non valide (avec le message d'erreur 'le champ' doit être numérique).

Important: Par défaut, si vous extrayez quelque chose de ces paramètres de requête, ce sera toujours une chaîne, car il s'agit de l'URL qui 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 une instruction.

0
Mile Mijatovic