route node another node.js express query-string

node.js - node - ¿Cómo acceder a los parámetros GET después de "?" En Express?



express url params (8)

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 en /sample/2 ).

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

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


El manual expreso dice que debe usar req.query para acceder a QueryString.

// Requesting /display/post?size=small app.get(''/display/post'', function(req, res, next) { var isSmall = req.query.size === ''small''; // > true // ... });


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

req.params se refiere a los elementos con un '':'' en la URL y req.query se refiere a los elementos asociados con el ''?''

Ejemplo:

GET /something?color1=red&color2=blue

Luego en expreso, el manejador:

app.get(''/somthing'',(req,res) => { req.query.color1 === "red"; //true req.query.color2 === "blue"; // true });


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

Necesitas usar ambos en una sola URL de enrutamiento

Por favor marque abajo el ejemplo puede ser útil para usted.

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

Obtener el enlace para pasar su segundo segmento es su id. De ejemplo: http://localhost:port/sample/123

Si tiene problemas, utilice el paso de variables como cadena de consulta con ''?'' operador

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

Obtenga un enlace como 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; ................ });

Obtenga el ejemplo de enlace: http://localhost:port/sample/123?id=123


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

Pero solo para hacerlo más claro:

req.params se rellenará solo con los valores de la ruta. Es decir, si tiene una ruta como /users/:id , puede acceder a la 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 o no en la ruta. Por supuesto, los parámetros en la cadena de consulta estarán disponibles en req.query y los parámetros en un cuerpo de publicación estarán disponibles en req.body .

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


Una buena técnica que he empezado a usar con algunas de mis aplicaciones en Express es crear un objeto que fusione los campos de consulta, parámetros 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 el cuerpo de su controlador, o en cualquier otro lugar dentro del alcance 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 hace que sea agradable y práctico simplemente "ahondar" en todos los "datos personalizados" que un usuario puede haber enviado con su solicitud.

Nota

¿Por qué el campo ''accesorios''? Debido a que se trataba de un fragmento de código reducido, utilizo 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"; } }


Use req.query para obtener el valor en el parámetro de cadena de consulta en la ruta. Consulte los req.query . Diga que si en una ruta, http://localhost:3000/?name=satyam desea obtener un valor para el parámetro de nombre, entonces su controlador de ruta ''Get'' irá 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 forma preferida de hacerlo, sin embargo, pensé que me gustaría señalar que también puede acceder a los parámetros de url, publicación y enrutamiento, todos 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
  • pregunta

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

El acceso directo a req.body, req.params y req.query debe ser favorecido para mayor claridad, a menos que realmente acepte la entrada 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.


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!'') )