Node.js: diferencia entre req.query [] y req.params

124

¿Hay alguna diferencia entre obtener argumentos QUERY_STRING a través de req.query[myParam]y req.params.myParam? Si es así, ¿cuándo debería usar cuál?

Pavindu
fuente

Respuestas:

142

req.paramscontiene parámetros de ruta (en la parte de ruta de la URL) y req.querycontiene los parámetros de consulta de URL (después de ?en la URL).

También puede usar req.param(name)para buscar un parámetro en ambos lugares (así como req.body), pero este método ahora está en desuso.

JohnnyHK
fuente
Ah, está bien, gracias, ambos son proporcionados por Express. ¿Y los datos POST a los que accedo a través de req.body.myParam?
1
Correcto. Cuál usar depende de lo que intente hacer.
JohnnyHK
También tenga en cuenta: "El acceso directo a req.body, req.params y req.query debe favorecerse para mayor claridad, a menos que realmente acepte la entrada de cada objeto". - documentación expresa
Ryan Q
2
req.paramahora está en desuso. Node sugiere usar req.queryoreq.params
SaiyanGirl
3
¿Por qué desaprobarlo? ¿Qué pasa si usamos params o query y luego decidimos cambiarlo por otro?
John
247

Dada esta ruta

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

y dada esta URL http://www.google.com/hi/there?qs1=you&qs2=tube

Usted tendrá:

req. consulta

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

req. params

{
  param1: 'there'
}

Parámetros requeridos expresos >>

Ruffrey
fuente
¿Y si necesito obtener / hola /?
Daniel
2
eche un vistazo a req.url o req.originalUrl o req._originalUrl, luego divida en el/
ruffrey
22

Suponga que ha definido el nombre de su ruta así:

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

que se convertirá en:

https://localhost:3000/user/5896544

Aquí, si va a imprimir: request.params

{
userId : 5896544
}

entonces

request.params.userId = 5896544

así que request.params es un objeto que contiene propiedades a la ruta nombrada

y request.query proviene de los parámetros de consulta en la URL, por ejemplo:

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

request.query

{

userId: 5896544

}

entonces

request.query.userId = 5896544
Deeksha Sharma
fuente
Buena explicación
Abk
7

Debería poder acceder a la consulta usando notación de puntos ahora.

Si desea acceder, diga que está recibiendo una solicitud GET en /checkEmail?type=email&utm_source=xxxx&email=xxxxx&utm_campaign=XXy desea obtener la consulta utilizada.

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

Los parámetros se utilizan para el parámetro autodefinido para recibir la solicitud, algo como (ejemplo):

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
fuente
0

Quiero mencionar una nota importante al respecto req.query, porque actualmente estoy trabajando en la funcionalidad de paginación basada enreq.query y tengo un ejemplo interesante para demostrarles ...

Ejemplo:

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

Notarás un +letrero frente areq.query.pageSize yreq.query.currentPage

¿Por qué? Si borras+ en este caso, obtendrá un error, y ese error se lanzará porque usaremos un tipo no válido (con el mensaje de error, el campo 'límite' debe ser numérico).

Importante : De forma predeterminada, si extrae algo de estos parámetros de consulta, siempre será una cadena , porque viene la URL y se trata como un texto.

Si necesitamos trabajar con números y convertir declaraciones de consulta de texto a número, simplemente podemos agregar un signo más delante de la declaración.

Mile Mijatović
fuente