Comment accéder aux parameters GET après “?” Dans Express?

Je sais comment obtenir les parameters pour des requêtes comme celle-ci:

app.get('/sample/:id', routes.sample); 

Dans ce cas, je peux utiliser req.params.id pour obtenir le paramètre (par exemple 2 dans /sample/2 ).

Cependant, pour url comme /sample/2?color=red , comment puis-je accéder à la color variable?

J’ai essayé req.params.color mais cela n’a pas fonctionné.

Donc, après avoir vérifié la référence expresse , j’ai trouvé que req.query.color me req.query.color la valeur que je cherchais.

Utilisez req.query pour obtenir la valeur dans le paramètre de chaîne de requête de la route. Se référer à la demande . Dites si dans une route, http: // localhost: 3000 /? Name = satyam vous voulez obtenir la valeur pour le paramètre name, alors votre gestionnaire de route ‘Get’ se comportera comme ceci: –

 app.get('/', function(req, res){ console.log(req.query.name); res.send('Response send to client::'+req.query.name); }); 

Mise à jour: req.param() est maintenant obsolète, donc n’utilisez pas cette réponse.


Votre réponse est la manière préférée de le faire, cependant je pensais que vous pouviez également accéder aux parameters url, post et route avec req.param(parameterName, defaultValue) .

Dans ton cas:

 var color = req.param('color'); 

Du guide express:

la recherche est effectuée dans l’ordre suivant:

  • req.params
  • req.body
  • req.query

Notez que le guide indique ce qui suit:

L’access direct à req.body, req.params et req.query doit être privilégié pour plus de clarté, à moins que vous n’acceptiez vraiment les entrées de chaque object.

Cependant, en pratique, req.param() est suffisamment clair et facilite certains types de refactoring.

La réponse de @ Zugwait est correcte. req.param() est obsolète. Vous devez utiliser req.params , req.query ou req.body .

Mais juste pour le rendre plus clair:

req.params sera req.params uniquement avec les valeurs de l’itinéraire. En d’autres req.params.id , si vous avez une route comme /users/:id , vous pouvez accéder à l’ id soit dans req.params.id soit dans req.params['id'] .

req.query et req.body seront remplis avec tous les parameters, qu’ils soient ou non sur la route. Bien entendu, les parameters de la chaîne de requête seront disponibles dans req.query et les parameters dans un post corps seront disponibles dans req.body .

Donc, en répondant à vos questions, comme la color n’est pas dans la route, vous devriez pouvoir l’obtenir en utilisant req.query.color ou req.query['color'] .

Hey chaîne de requête et les parameters sont différents.

Vous devez utiliser les deux dans une seule URL de routage

Veuillez cocher les exemples ci-dessous.

 app.get('/sample/:id', function(req, res) { var id = req.params.id; //or use req.param('id') ................ }); 

Obtenir le lien passer votre deuxième segment est votre exemple id: http: // localhost: port / file-upload / 123

Si vous rencontrez un problème, veuillez utiliser Passing variables en tant que chaîne de requête avec ‘?’ opérateur

  app.get('/sample', function(req, res) { var id = req.query.id; ................ }); 

Obtenez le lien comme celui-ci: http: // localhost: port / sample? Id = 123

Les deux dans un seul exemple

 app.get('/sample/:id', function(req, res) { var id = req.params.id; //or use req.param('id') var id2 = req.query.id; ................ }); 

Exemple de post-lien: http: // localhost: port / sample / 123? Id = 123

Le manuel express indique que vous devez utiliser req.query pour accéder à la chaîne de requête .

 // Requesting /display/post?size=small app.get('/display/post', function(req, res, next) { var isSmall = req.query.size === 'small'; // > true // ... }); 
 const express = require('express') const bodyParser = require('body-parser') const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js') const app = express() app.set('view engine', 'pug') app.use(express.static('public')) app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) app.get('/', (req, res) => { usersNdJobs() .then((users) => { res.render('users', { users }) }) .catch(console.error) }) app.get('/api/company/users', (req, res) => { const companyname = req.query.companyName console.log(companyname) userByJob(companyname) .then((users) => { res.render('job', { users }) }).catch(console.error) }) app.post('/api/users/add', (req, res) => { const userName = req.body.userName const jobName = req.body.jobName console.log("user name = "+userName+", job name : "+jobName) addUser(userName, jobName) .then((result) => { res.status(200).json(result) }) .catch((error) => { res.status(404).json({ 'message': error.toSsortingng() }) }) }) app.post('/users/add', (request, response) => { const { userName, job } = request.body addTeam(userName, job) .then((user) => { response.status(200).json({ "userName": user.name, "city": user.job }) .catch((err) => { request.status(400).json({"message": err}) }) }) app.post('/api/user/company/add', (req, res) => { const userName = req.body.userName const companyName = req.body.companyName console.log(userName, companyName) addUserToCompany(userName, companyName) .then((result) => { res.json(result) }) .catch(console.error) }) app.get('/api/company/user', (req, res) => { const companyname = req.query.companyName console.log(companyname) userByJob(companyname) .then((users) => { res.render('jobs', { users }) }) }) app.listen(3000, () => console.log('Example app listening on port 3000!') ) 

Une bonne technique que j’ai commencé à utiliser avec certaines de mes applications sur Express est de créer un object qui fusionne la requête, les parameters et les champs de corps de l’object de requête express.

 //./express-data.js const _ = require("lodash"); class ExpressData { /* * @param {Object} req - express request object */ constructor (req) { //Merge all data passed by the client in the request this.props = _.merge(req.body, req.params, req.query); } } module.exports = ExpressData; 

Ensuite, dans votre corps de contrôleur ou ailleurs dans la scope de la chaîne de demandes express, vous pouvez utiliser quelque chose comme ci-dessous:

 //./some-controller.js const ExpressData = require("./express-data.js"); const router = require("express").Router(); router.get("/:some_id", (req, res) => { let props = new ExpressData(req).props; //Given the request "/592363122?foo=bar&hello=world" //the below would log out // { // some_id: 592363122, // foo: 'bar', // hello: 'world' // } console.log(props); return res.json(props); }); 

Cela rend agréable et pratique de “plonger” dans toutes les “données personnalisées” qu’un utilisateur peut avoir envoyé avec sa demande.

Remarque

Pourquoi le champ “accessoires”? Comme il s’agissait d’un extrait de code réduit, j’utilise cette technique dans un certain nombre de mes API. Je stocke également des données d’authentification / autorisation sur cet object, par exemple ci-dessous.

 /* * @param {Object} req - Request response object */ class ExpressData { /* * @param {Object} req - express request object */ constructor (req) { //Merge all data passed by the client in the request this.props = _.merge(req.body, req.params, req.query); //Store reference to the user this.user = req.user || null; //API connected devices (Mobile app..) will send x-client header with requests, web context is implied. //This is used to determine how the user is connecting to the API this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web"; } }