¿Cómo acceder a los parámetros GET después de “?” En Express?

Sé cómo obtener los parámetros para consultas como esta:

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

En este caso, puedo usar req.params.id para obtener el parámetro (por ejemplo, 2 in /sample/2 ).

Sin embargo, para url like /sample/2?color=red , ¿cómo puedo acceder al color variable?

Intenté req.params.color pero no funcionó.

Entonces, después de consultar la referencia expresa , encontré que req.query.color me devolvería el valor que estoy buscando.

Use req.query, para obtener el valor en el parámetro de cadena de consulta en la ruta. Referir pregunta . Digamos que si en una ruta, http: // localhost: 3000 /? Name = satyam quieres obtener un valor para el parámetro name, entonces tu manejador de ruta ‘Get’ funcionará así: –

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

Actualización: req.param() ahora está en desuso, por lo que en adelante no use esta respuesta.


Su respuesta es la mejor manera de hacerlo, sin embargo, creo que debo señalar que también puede acceder a los parámetros de url, publicación y ruta, todo con req.param(parameterName, defaultValue) .

En tu caso:

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

De la guía expresa:

la búsqueda se realiza en el siguiente orden:

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

Tenga en cuenta que la guía dice lo siguiente:

Se debe favorecer el acceso directo a la solicitud de req.body, req.params y req.query, para mayor claridad, a menos que realmente acepte los aportes de cada objeto.

Sin embargo, en la práctica, he encontrado que req.param() es lo suficientemente claro y facilita ciertos tipos de refactorización.

La respuesta de @Zugwait es correcta. req.param() está en desuso. Debe usar req.params , req.query o req.body .

Pero solo para hacerlo más claro:

req.params se completará con solo los valores de ruta. Es decir, si tiene una ruta como /users/:id , puede acceder al id en req.params.id o req.params['id'] .

req.query y req.body se rellenarán con todos los parámetros, independientemente de si están en la ruta o no. Por supuesto, los parámetros en la cadena de consulta estarán disponibles en consulta req.query y los parámetros en un cuerpo de publicación estarán disponibles en req.body .

Entonces, respondiendo sus preguntas, ya que el color no está en la ruta, debería poder obtenerlo utilizando req.query.color o req.query['color'] .

Hey cadena de consulta y los parámetros son diferentes.

Debe usar ambos en url de enrutamiento único

Por favor revisa los siguientes ejemplos. Sé útil.

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

Obtener enlace pase su segundo segmento es su ejemplo id: http: // localhost: puerto / archivo-cargar / 123

Si enfrenta un problema, utilice Pasar variables como cadena de consulta con ‘?’ operador

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

Obtenga un enlace similar a este ejemplo: http: // localhost: port / sample? Id = 123

Ambos en un solo ejemplo

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

Ejemplo de ejemplo de enlace posterior: http: // localhost: port / sample / 123? Id = 123

El manual express dice que debe usar la solicitud de acceso para acceder a QueryString.

 // 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.toString() }) }) }) 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!') ) 

Una buena técnica que he comenzado a usar con algunas de mis aplicaciones en Express es crear un objeto que combina los campos de consulta, params y cuerpo del objeto de solicitud de 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; 

Luego, en su cuerpo de controlador, o en cualquier otro lugar dentro del scope de la cadena de solicitud expresa, puede usar algo como a continuación:

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

Esto lo hace agradable y práctico para simplemente “profundizar” en todos los “datos personalizados” que un usuario puede haber enviado con su solicitud.

Nota

¿Por qué el campo ‘accesorios’? Como se trataba de un fragmento reducido, uso esta técnica en varias de mis API, también almaceno datos de autenticación / autorización en este objeto, ejemplo a continuación.

 /* * @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"; } }