¿Cómo obtener variables GET (cadena de consulta) en Express.js en Node.js?

1193

¿Podemos obtener las variables en la cadena de consulta en Node.js tal como las tenemos $_GETen PHP?

Sé que en Node.js podemos obtener la URL en la solicitud. ¿Hay algún método para obtener los parámetros de la cadena de consulta?

X Men
fuente
66
La respuesta de @ whitequark (la que tiene más votos) debe marcarse como la respuesta correcta. ¿Te importaría actualizarlo para otros con la misma pregunta que tú que tropezó con tu pregunta?
Dev01
Utilice el objeto de consulta en la solicitud expresa: aquí hay ejemplos que utilizan la consulta de solicitud expresa
drorw
@ Dev01 no está activo desde 2014 lol
John Balvin Arias
Si alguien busca Nodejs API repetitivo con Expressjs y MongoDB. Pruebe esto: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Respuestas:

1183

En Express ya está hecho para usted y simplemente puede usar req.query para eso:

var id = req.query.id; // $_GET["id"]

De lo contrario, en NodeJS, puede acceder a req.url y al urlmódulo integrado para [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) manualmente:

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
Marcus Granström
fuente
24
atención aquí: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
antes del
¿Qué funcionalidad adicional / mejor proporciona hapi (si la hay)?
BaltoStar
180
Esto se acepta pero no es la respuesta preferida. ¡Vea abajo! usoreq.query
Cheeso
2
La respuesta de mikemcneil a continuación es una mejor opción. Use req.queryo req.param(que es diferente de req.params... ver más abajo.
MindJuice
99
-1 . El código anterior es un peso muerto, algo que un buen desarrollador refactorizará en el acto. Esta es una respuesta a " ¿Cómo obtener la cadena de consulta de una URL? ": La URL en cuestión está en un objeto llamado requesty no tiene nada que ver con Express. Vea la respuesta de @ whitequark a continuación (uso request.query)
lunohodov el
1649

Como ha mencionado Express.js en sus etiquetas, aquí hay una respuesta específica de Express: use req.query . P.ej

var express = require('express');
var app = express();

app.get('/', function(req, res){
  res.send('id: ' + req.query.id);
});

app.listen(3000);
Whitequark
fuente
68
Vale la pena mencionar que debe usar req.query.id, no es necesario usar la notación de corchetes.
alex
Para instalar express hazlo: sí | sudo npm install -g express --- Traté de editar pero Alexis King ha sido revertido.
Felipe
En la pregunta, estaba buscando una forma de obtener todos los parámetros de la cadena de consulta como una matriz. La respuesta correcta es esta: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato
463

En Express, use req.query.

req.paramssolo obtiene los parámetros de ruta, no los parámetros de cadena de consulta. Consulte la documentación de express o Sails :

(req.params) Comprueba los parámetros de ruta, por ejemplo: / user /: id

(req.query) Comprueba los parámetros de la cadena de consulta, por ejemplo:? id = 12 Comprueba los parámetros del cuerpo urlencoded

(req.body), ej: id = 12 Para utilizar cuerpos de solicitud codificados por urlen, req.body debe ser un objeto. Esto se puede hacer utilizando el middleware _express.bodyParser.

Dicho esto, la mayoría de las veces, desea obtener el valor de un parámetro independientemente de su origen. En ese caso, use req.param('foo').

El valor del parámetro se devolverá si la variable estaba en los parámetros de ruta, cadena de consulta o el cuerpo de solicitud codificado.

Nota al margen: si desea obtener la intersección de los tres tipos de parámetros de solicitud (similar a PHP $_REQUEST), solo necesita fusionar los parámetros juntos: así es como lo configuré en Sails . Tenga en cuenta que el objeto de parámetros de ruta / ruta ( req.params) tiene propiedades de matriz, por lo que el orden es importante (aunque esto puede cambiar en Express 4 )

mikermcneil
fuente
req.param ('STRING') es la respuesta correcta. Ver aquí: stackoverflow.com/questions/17007997/… (desplácese hacia abajo para responder debajo de la respuesta aceptada)
Joseph Juhnke
3
@deltab aquí hay un enlace a req.paramslos documentos de Sails: sailsjs.org/#/documentation/reference/req/req.params.html y los nuevos documentos express: expressjs.com/4x/api.html#req.params
mikermcneil
77
req.param está en desuso en express 4.x, debe usar req.params, req.body o req.query en su lugar: expressjs.com/en/4x/api.html#req.param
swang
@swang tiene razón: recientemente verifiqué con Doug Wilson sobre esto, y req.param()es probable que la función auxiliar se elimine por completo en Express 5. Esto no será inminente hasta algún tiempo más tarde en 2017, así que esperaré para editar Esta respuesta hasta entonces. Mientras tanto: es seguro de usar req.param()con Express <= 3.x / Sails <= 0.12, y con la última versión disponible de Express 4, aunque con un mensaje de registro de obsolescencia. (Para los usuarios de velas: La implementación de req.param()se moverá en el núcleo como de las Velas v1.0, y va a seguir apoyando plenamente en Velas en el futuro.)
mikermcneil
142

Para Express.js que quieres hacer req.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});
Cris-O
fuente
8
para recuperar variables GET en express.js puede usar req.query.
Ben Sinclair
66
@Andy req.params es mejor porque: req.param (nombre [, predeterminado]): devolverá el valor del nombre de parámetro cuando esté presente o predeterminado. Comprueba los parámetros de ruta (parámetros necesarios), por ejemplo: / user /: id Comprueba los parámetros de cadena de consulta (consulta), por ejemplo:? Id = 12 Comprueba parámetros del cuerpo codificados (cuerpo requerido), ej: id = 12 Para utilizar la solicitud codificada cuerpos, req.body debe ser un objeto. Esto se puede hacer utilizando el middleware _express.bodyParser.
Cris-O
No sabía que req.param busca req.query, gracias por esta nota.
Ben Sinclair
3
req.param ('parameterName') verificará req.body, req.query y req.params, pero si desea que todos los parámetros de consulta sean un objeto, debe usar req.query.
mikermcneil
1
@mikermcneil probablemente mezcló req.param () y req.params (object). De acuerdo con expressjs docs, req.param () busca valor en los tres objetos. expressjs.com/api.html#req.param
Ben Sinclair
78

Aprendí de las otras respuestas y decidí usar este código en todo mi sitio:

var query = require('url').parse(req.url,true).query;

Entonces puedes llamar

var id = query.id;
var option = query.option;

donde debe estar la URL para obtener

/path/filename?id=123&option=456
Grant Li
fuente
2
¿la identificación y la opción no estarán indefinidas ya que la consulta es solo una cadena? tendríamos que analizar los dos parámetros separados con una expresión regular o similar.
ossek
1
@ossek Creo que el acto de causar parseen req.urllos convertidos a un objeto.
whitfin 01 de
1
@ossek, se proporciona verdadero como un segundo argumento para url.parse, lo que hace que la propiedad de consulta apunte a un objeto (y que internamente utiliza el módulo de cadena de consulta). Puede encontrar más información al respecto en los documentos [aquí] ( nodejs.org/docs / latest / api / ... )
Bharat
Funcionó ... muchas gracias!
Prateek Gupta
50
//get query&params in express

//etc. example.com/user/000000?sex=female

app.get('/user/:id', function(req, res) {

  const query = req.query;// query = {sex:"female"}

  const params = req.params; //params = {id:"000000"}

})
bigboss
fuente
48

Si está utilizando ES6 y Express , pruebe este destructuringenfoque:

const {id, since, fields, anotherField} = request.query;

En contexto:

const express = require('express');
const app = express();

app.get('/', function(req, res){
   const {id, since, fields, anotherField} = req.query;
});

app.listen(3000);

También puede usar valores predeterminados con destructuring:

// sample request for testing
const req = {
  query: {
    id: '123',
    fields: ['a', 'b', 'c']
  }
}

const {
  id,
  since = new Date().toString(),
  fields = ['x'],
  anotherField = 'default'
} = req.query;

console.log(id, since, fields, anotherField)

Steven Spungin
fuente
¡Usando la desestructuración de objetos con valores predeterminados! +1
Desarrollador principal el
43

Hay 2 formas de pasar parámetros a través del método GET

Método 1: El enfoque MVC donde pasa los parámetros como / routename /: paramname
En este caso puede usar req.params.paramname para obtener el valor del parámetro. Por ejemplo, consulte el siguiente código donde I Espero que Id como un
enlace param pueda ser como: http://myhost.com/items/23

var express = require('express');
var app = express();
app.get("items/:id", function(req, res) {
    var id = req.params.id;
    //further operations to perform
});
app.listen(3000);

Método 2: Enfoque general: pasar variables como cadena de consulta usando '?' operador
Por ejemplo, consulte el código a continuación donde espero Id como un
enlace de parámetro de consulta podría ser: http://myhost.com/items?id=23

var express = require('express');
var app = express();
app.get("/items", function(req, res) {
    var id = req.query.id;
    //further operations to perform
});
app.listen(3000);
Omkar Bandkar
fuente
40

Deberías poder hacer algo como esto:

var http = require('http');
var url  = require('url');

http.createServer(function(req,res){
    var url_parts = url.parse(req.url, true);
    var query = url_parts.query;

    console.log(query); //{Object}

    res.end("End")
})
RobertPitt
fuente
26

ACTUALIZACIÓN 4 de mayo de 2014

Antigua respuesta conservada aquí: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Instalar express: npm install express

app.js

var express = require('express');
var app = express();

app.get('/endpoint', function(request, response) {
    var id = request.query.id;
    response.end("I have received the ID: " + id);
});

app.listen(3000);
console.log("node express app started at http://localhost:3000");

2) Ejecute la aplicación: node app.js

3) Visita en el navegador: http://localhost:3000/endpoint?id=something

He recibido la identificación: algo


(Muchas cosas han cambiado desde mi respuesta y creo que vale la pena mantenerlas actualizadas)

Mars Robertson
fuente
20

Un pequeño servidor HTTP Node.js que escucha en el puerto 9080, analiza los datos GET o POST y los envía de vuelta al cliente como parte de la respuesta es:

var sys = require('sys'),
url = require('url'),
http = require('http'),
qs = require('querystring');

var server = http.createServer(

    function (request, response) {

        if (request.method == 'POST') {
                var body = '';
                request.on('data', function (data) {
                    body += data;
                });
                request.on('end',function() {

                    var POST =  qs.parse(body);
                    //console.log(POST);
                    response.writeHead( 200 );
                    response.write( JSON.stringify( POST ) );
                    response.end();
                });
        }
        else if(request.method == 'GET') {

            var url_parts = url.parse(request.url,true);
            //console.log(url_parts.query);
            response.writeHead( 200 );
            response.write( JSON.stringify( url_parts.query ) );
            response.end();
        }
    }
);

server.listen(9080);

parse.jsGuárdelo como y ejecútelo en la consola ingresando "node parse.js".

adriano72
fuente
3
no necesita requerir sys en este ejemplo
danwellman
20

Whitequark respondió amablemente. Pero con las versiones actuales de Node.js y Express.js requiere una línea más. Asegúrese de agregar el 'requerir http' (segunda línea). He publicado un ejemplo más completo aquí que muestra cómo puede funcionar esta llamada. Una vez que se ejecute, escriba http://localhost:8080/?name=abel&fruit=applesu navegador y obtendrá una buena respuesta basada en el código.

var express = require('express');
var http = require('http');
var app = express();

app.configure(function(){
    app.set('port', 8080);
});

app.get('/', function(req, res){
  res.writeHead(200, {'content-type': 'text/plain'});
  res.write('name: ' + req.query.name + '\n');
  res.write('fruit: ' + req.query.fruit + '\n');
  res.write('query: ' + req.query + '\n');
  queryStuff = JSON.stringify(req.query);
  res.end('That\'s all folks'  + '\n' + queryStuff);
});

http.createServer(app).listen(app.get('port'), function(){
    console.log("Express server listening on port " + app.get('port'));
})
james d'angelo
fuente
15

Es tan simple:

URL de ejemplo:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK

Puede imprimir todos los valores de la cadena de consulta utilizando:

console.log("All query strings: " + JSON.stringify(req.query));

Salida

Todas las cadenas de consulta: {"id": "3", "enablekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Para imprimir en específico:

console.log("activatekey: " + req.query.activatekey);

Salida

Activar clave: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK

Saran Pal
fuente
13

Puedes usar

request.query.<varible-name>;
Yash Bele
fuente
13

Puede usar con express ^ 4.15.4:

var express = require('express'),
    router = express.Router();
router.get('/', function (req, res, next) {
    console.log(req.query);
});

Espero que esto ayude.

ajafik
fuente
6

En express.jspuedes hacerlo bastante fácil, todo lo que necesitas hacer en la función de tu controlador es:

app.get('/', (req, res, next) => {
   const {id} = req.query;
   // rest of your code here...
})

Y eso es todo, suponiendo que esté utilizando la sintaxis es6.

PD. {id}significa Object destructuring, una nueva característica es6.

Kevin Alemán
fuente
Estoy usando express con node, así que esto funcionó perfectamente para mí. ¡Gracias!
user752746
4
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

Puede usar esto o puede probar body-parser para analizar elementos especiales de los parámetros de solicitud.

Mehedi Abdullah
fuente
1
¿Puedes explicar más cómo esto responde la pregunta?
Nico Haase
¿Y cómo analiza esto una lista de parámetros existente?
Nico Haase
puede usar el módulo body-parser de node.js
Mehedi Abdullah
1

En realidad es simple:

const express= require('express');
const app = express();

app.get('/post', (req, res, next) => {
  res.send('ID:' + req.query.id + ' Edit:'+ req.query.edit);
});

app.listen(1000);

// localhost:1000/post?id=123&edit=true
// output: ID: 123 Edit: true
Md. A. Barik
fuente
0

puede usar el módulo url para recopilar parámetros usando url.parse

var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;

En expressjs se hace por,

var id = req.query.id;

P.ej:

var express = require('express');
var app = express();

app.get('/login', function (req, res, next) {
    console.log(req.query);
    console.log(req.query.id); //Give parameter id
});
Codemaker
fuente
0

En Express, simplemente podemos usar req.query.<name>. Funciona igual que $_GET['name']en PHP.

Ankit Singh
fuente
0

Desde mi punto de vista, creo que muchas personas mezclan dos conceptos diferentes. Durante el desarrollo de REST estaba familiarizado con pasar información en la URL con dos formas de "variables de ruta" y "parámetros de solicitud" (parámetros de consulta). El RFC describe las partes de URI de esta manera: ingrese la descripción del enlace aquí Así que entendí que el autor desea saber cómo pasar los parámetros de solicitud. Solo quisiera hacer que el tema sea más fácil de entender, pero la solución se mencionó aquí muchas veces.

Puede obtener parámetros de consulta del URI con request.query.<name of the parameter>, la segunda solución mencionada fue request.params.<name of the parameter>y con esto puede obtener las variables de ruta.

Peter S.
fuente
0

Por lo tanto, hay dos formas en que se puede recibir esta "identificación": 1) usando parámetros: los parámetros de código se verán así: Digamos que tenemos una matriz,

const courses = [{
    id: 1,
    name: 'Mathematics'
},
{
    id: 2,
    name: 'History'
}
];

Luego, para los parámetros, podemos hacer algo como:

app.get('/api/posts/:id',(req,res)=>{
    const course = courses.find(o=>o.id == (req.params.id))
    res.send(course);
});

2) Otro método es usar parámetros de consulta. entonces la url se verá como "..... \ api \ xyz? id = 1" donde "? id = 1" es la parte de la consulta. En este caso podemos hacer algo como:

app.get('/api/posts',(req,res)=>{
    const course = courses.find(o=>o.id == (req.query.id))
    res.send(course);
});
abcbc
fuente
0
var express = require('express');
var app = express();

app.get('/', function(req, res){
  res.send('id: ' + req.query.id);
});

app.listen(3000);
Sarthak Dalabehera
fuente
0

Si alguna vez necesita enviar una GETsolicitud a un IPasí como a Domain(Otras respuestas no mencionaron que puede especificar una portvariable), puede hacer uso de esta función:

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

No se pierda requerir módulos en la parte superior de su archivo:

http = require("http");
url = require('url')

También tenga en cuenta que puede usar el httpsmódulo para comunicarse a través de dominios seguros y SSL. entonces estas dos líneas cambiarían:

https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
AmiNadimi
fuente
-1

¿Por qué no mezclar con el código del servidor?

p.ej . php

<script>
var ip=<?php echo($_SERVER['REMOTE_ADDR']);?>

</script>
chings228
fuente
-2

Estoy usando MEANJS 0.6.0 con [email protected], es bueno

Cliente:

Controlador:

var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)

servicios:

this.getOrder = function (input) {return $http.get('/api/order', { params: input });};

Servidor

rutas

app.route('/api/order').get(products.order);

controlador

exports.order = function (req, res) {
  var keyword = req.query.keyword
  ...
Tính Ngô Quang
fuente
-3

-------- Acceso a los datos de la cadena de consulta -------
Supongamos que este es el enlace http://webapplog.com/search?term=node.js&page=1

Entonces, en express puedes usar:

  • req.query.term
  • req.query.page o
  • req.query(buscará la consulta en un objeto)

    // Ejemplo
    app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{ res.json({term:req.query.term, page:req.query.page}) })

-------- Acceso a los parámetros de URL -------
Supongamos que este es el enlace http://webapplog.com/node.js/pages/100
Por lo tanto, en express puede usar: app.get('/:term/pages/:page',....)

  • req.params.term
  • req.params.page

    // Ejemplo
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
Moulali M
fuente