Come ottenere variabili GET (query string) in Express.js su Node.js?


1193

Possiamo ottenere le variabili nella stringa di query in Node.js proprio come le inseriamo $_GETin PHP?

So che in Node.js possiamo ottenere l'URL nella richiesta. Esiste un metodo per ottenere i parametri della stringa di query?


6
La risposta di @ whitequark (quella con il maggior numero di voti) deve essere contrassegnata come risposta corretta. Ti dispiace aggiornarlo per gli altri con la tua stessa domanda che inciampare nella tua domanda?
Dev01,

Usa l'oggetto query nella richiesta espressa - ecco alcuni esempi usando la richiesta richiesta esplicita
drorw

@ Dev01 non è attivo dal 2014 lol
John Balvin Arias il

Se qualcuno cerca Natejs API boilerplate con Expressjs e MongoDB. Prova questo: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Risposte:


1183

In Express è già fatto per te e puoi semplicemente usare req.query per questo:

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

Altrimenti, in NodeJS, puoi accedere a req.url e al urlmodulo integrato su [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;

24
attenzione qui: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

Quale funzionalità aggiuntiva / migliore fornisce hapi (se presente)?
BaltoStar,

180
Questo è accettato ma non è la risposta preferita. Vedi sotto! usoreq.query
Cheeso

2
La risposta di mikemcneil di seguito è una scelta migliore. Usa req.queryo req.param(che è diverso da req.params... vedi sotto.
MindJuice

9
-1 . Il codice sopra è un peso morto - qualcosa che un buon sviluppatore rifatterà sul posto. Questa è una risposta a " Come ottenere la stringa di query di un URL? ": L'URL in questione si trova in un oggetto denominato requeste non ha nulla a che fare con Express. Vedi la risposta di @ whitequark di seguito (uso request.query)
lunohodov

1649

Dato che hai citato Express.js nei tag, ecco una risposta specifica per Express: usa req.query . Per esempio

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

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

app.listen(3000);

68
Vale la pena ricordare che è necessario utilizzare req.query.id, non è necessario utilizzare la notazione parentesi.
alex,

Per installare express fallo: si | sudo npm install -g express --- Ho provato a modificare ma Alexis King è stato ripristinato.
Felipe,

nella domanda stava cercando un modo per ottenere tutti i parametri della stringa di query come un array. La risposta corretta è questa: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato,

463

In Express, utilizzare req.query.

req.paramsottiene solo i parametri di route, non i parametri della stringa di query. Vedi la documentazione di express o sails :

(req.params) Controlla i parametri del percorso, ad es .: / user /: id

(req.query) Verifica i parametri della stringa di query, ad es.? id = 12 Controlla i parametri del corpo codificati

(req.body), ex: id = 12 Per utilizzare i corpi di richiesta con urlencod, req.body dovrebbe essere un oggetto. Questo può essere fatto usando il middleware _express.bodyParser.

Detto questo, la maggior parte delle volte, si desidera ottenere il valore di un parametro indipendentemente dalla sua origine. In tal caso, utilizzare req.param('foo').

Il valore del parametro verrà restituito indipendentemente dal fatto che la variabile si trovasse nei parametri del percorso, nella stringa di query o nel corpo della richiesta codificato.

Nota a margine: se stai cercando di ottenere l'intersezione di tutti e tre i tipi di parametri di richiesta (simili a quelli di PHP $_REQUEST), devi solo unire i parametri insieme: ecco come l'ho impostato in Sails . Tieni presente che l'oggetto parametri path / route ( req.params) ha proprietà array, quindi l'ordine è importante (sebbene ciò possa cambiare in Express 4 )


req.param ('STRING') è la risposta corretta. Vedi qui: stackoverflow.com/questions/17007997/… (scorri verso il basso per rispondere sotto la risposta accettata)
Joseph Juhnke,

3
@deltab ecco un link req.paramsnei documenti di Sails: sailsjs.org/#/documentation/reference/req/req.params.html e i nuovi documenti espressi: expressjs.com/4x/api.html#req.params
mikermcneil

7
req.param è deprecato in Express 4.x, dovrebbe invece utilizzare req.params, req.body o req.query: expressjs.com/en/4x/api.html#req.param
swang

@swang ha ragione- Ho ricontrollato recentemente con Doug Wilson su questo, e la req.param()funzione di supporto sarà probabilmente rimossa completamente in Express 5. Questo non sarà imminente fino a qualche tempo dopo nel 2017, quindi aspetterò di modificare questa risposta fino ad allora. Nel frattempo: è sicuro usare req.param()con Express <= 3.x / Sails <= 0.12 e con l'ultima versione disponibile di Express 4, anche se con un messaggio di registro di deprecazione. (Per gli utenti di Sails: L'implementazione di Sails req.param()verrà spostata nel core a partire da Sails v1.0 e continuerà a essere completamente supportata in Sails in futuro.)
mikermcneil,

142

Per Express.js vuoi fare req.params:

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

8
per recuperare le variabili GET in express.js è possibile utilizzare req.query.
Ben Sinclair il

6
@Andy req.params è migliore perché: req.param (nome [, predefinito]): Restituirà il valore del nome param quando presente o predefinito. Controlla i parametri del percorso (req.params), es: / user /: id Controlla i parametri della stringa di query (req.query), es:? Id = 12 Controlla i parametri del corpo codificati (req.body), ex: id = 12 Per utilizzare la richiesta codificata corpi, req.body dovrebbe essere un oggetto. Questo può essere fatto usando il middleware _express.bodyParser.
Cris-O,

Non sapevo che req.param controlla req.query, grazie per questa nota.
Ben Sinclair,

3
req.param ('parameterName') controllerà req.body, req.query e req.params, ma se vuoi tutti i parametri della query come oggetto, dovresti usare req.query.
mikermcneil,

1
@mikermcneil probabilmente hai confuso req.param () e req.params (oggetto). Secondo i documenti di expressjs req.param () cerca valore in tutti e tre gli oggetti. expressjs.com/api.html#req.param
Ben Sinclair,

78

Ho imparato dalle altre risposte e ho deciso di utilizzare questo codice in tutto il mio sito:

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

Quindi puoi semplicemente chiamare

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

dove dovrebbe essere l'URL per get

/path/filename?id=123&option=456

2
id e opzione non saranno definiti poiché la query è solo una stringa? dovremmo analizzare i due parametri separati con una regex o simili.
ossek,

1
@ossek Credo che l'atto di provocare parsesui req.urlconvertiti in un oggetto.
entro il

1
@ossek, ha fornito true come secondo argomento di url.parse, il che fa sì che la proprietà della query punti a un oggetto (e che utilizza internamente il modulo di querystring) ne puoi trovare di più nei documenti [qui] ( nodejs.org/docs / latest / api /… )
Bharat

Ha funzionato .... molte grazie !!!
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"}

})

48

Se stai usando ES6 ed Express , prova questo destructuringapproccio:

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

Nel contesto:

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

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

app.listen(3000);

Puoi usare anche i valori predefiniti 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)


Utilizzo della distruzione degli oggetti con valori predefiniti! +1
Sviluppatore principale

43

Esistono 2 modi per passare i parametri tramite il metodo GET

Metodo 1: L'approccio MVC in cui si passano i parametri come / routename /: paramname
In questo caso è possibile utilizzare req.params.paramname per ottenere il valore del parametro Ad esempio fare riferimento al codice sotto dove I Mi aspetto ID come
collegamento param potrebbe essere come: 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);

Metodo 2: Approccio generale: passaggio di variabili come stringa di query utilizzando '?' operatore
Ad esempio fare riferimento al codice sotto dove mi aspetto Id come
collegamento di un parametro di query potrebbe essere simile a: 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);

40

Dovresti essere in grado di fare qualcosa del genere:

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")
})

26

AGGIORNAMENTO 4 maggio 2014

Vecchia risposta conservata qui: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Installa 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) Avvia l'app: node app.js

3) Visita nel browser: http://localhost:3000/endpoint?id=something

Ho ricevuto l'ID: qualcosa


(molte cose sono cambiate dalla mia risposta e credo che valga la pena tenerle aggiornate)


20

Un piccolo server HTTP Node.js in ascolto sulla porta 9080, analizzando i dati GET o POST e rispedendoli al client come parte della risposta è:

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

Salvalo come parse.jsed eseguilo sulla console immettendo "node parse.js".


3
non è necessario richiedere sys in questo esempio
danwellman,

20

Whitequark ha risposto bene. Ma con le versioni correnti di Node.js ed Express.js richiede un'altra riga. Assicurati di aggiungere "richiedi http" (seconda riga). Ho pubblicato un esempio più completo qui che mostra come può funzionare questa chiamata. Una volta eseguito, digita il http://localhost:8080/?name=abel&fruit=appletuo browser e otterrai una risposta interessante in base al codice.

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

15

È così semplice:

URL di esempio:

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

È possibile stampare tutti i valori della stringa di query utilizzando:

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

Produzione

Tutte le stringhe di query: {"id": "3", "activkey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Per stampare specifici:

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

Produzione

activkey: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK



13

Puoi usare con express ^ 4.15.4:

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

Spero che sia di aiuto.


6

In express.jssi può ottenere abbastanza facile, tutto quello che dovete fare nella vostra funzione di regolatore è:

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

E questo è tutto, supponendo che tu stia usando la sintassi es6.

PD. {id}sta per Object destructuring, una nuova funzione es6.


Sto usando express con il nodo quindi questo ha funzionato perfettamente per me. Grazie!
user752746

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

Puoi usarlo o provare body-parser per analizzare l'elemento speciale dai parametri di richiesta.


1
Puoi spiegare ulteriormente come questo risponde alla domanda?
Nico Haase,

E come viene analizzato un elenco di parametri esistente?
Nico Haase,

puoi usare il modulo body-parser da node.js
Mehedi Abdullah,

1

In realtà è semplice:

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

0

puoi usare il modulo url per raccogliere i parametri usando url.parse

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

In expressjs è fatto da,

var id = req.query.id;

Per esempio:

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

0

In Express, possiamo semplicemente usare req.query.<name>. Funziona come quello di $_GET['name']PHP.


0

Dal mio punto di vista penso che molte persone mescolino due concetti diversi. Durante lo sviluppo REST ho avuto familiarità con il passaggio delle informazioni nell'URL con due modi "variabili di percorso" e "parametri di richiesta" (parametri di query). La RFC descrive le parti dell'URI in questo modo: inserire qui la descrizione del collegamento Quindi ho capito che l'autore vorrebbe sapere come passare i parametri di richiesta. Vorrei solo semplificare la comprensione dell'argomento, ma la soluzione è stata menzionata qui molte volte.

È possibile ottenere i parametri di query dall'URI con request.query.<name of the parameter>, la seconda soluzione menzionata era request.params.<name of the parameter>e con questo è possibile ottenere le variabili del percorso.


0

Quindi, ci sono due modi in cui questo "id" può essere ricevuto: 1) usando params: il parametro params avrà un aspetto simile: supponiamo che abbiamo un array,

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

Quindi per i params possiamo fare qualcosa del tipo:

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

2) Un altro metodo consiste nell'utilizzare i parametri della query. quindi l'URL sarà simile a "..... \ api \ xyz? id = 1" dove "? id = 1" è la parte della query. In questo caso possiamo fare qualcosa del tipo:

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

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

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

app.listen(3000);

0

Se hai bisogno di inviare GETrichiesta a un IPcosì come un Domain(Altre risposte non ha menzionato è possibile specificare una portvariabile), è possibile fare uso di questa funzione:

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

Non perdere i moduli richiesti nella parte superiore del tuo file:

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

Inoltre, tieni presente che puoi utilizzare il httpsmodulo per comunicare su domini sicuri e SSL. quindi queste due righe cambieranno:

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

-1

perché non mescolato con il codice del server

per esempio . php

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

</script>

-2

Sto usando MEANJS 0.6.0 con express@4.16, va bene

Cliente:

controller:

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

Servizi:

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

server

itinerari

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

controllore

exports.order = function (req, res) {
  var keyword = req.query.keyword
  ...

-3

-------- Accesso ai dati della stringa di query -------
Supponiamo che questo sia il link http://webapplog.com/search?term=node.js&page=1

Quindi in Express puoi usare:

  • req.query.term
  • req.query.page o
  • req.query(recupererà la query in un oggetto)

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

-------- Accesso ai parametri URL -------
Supponiamo che questo sia il link http://webapplog.com/node.js/pages/100
Quindi in Express puoi usare: app.get('/:term/pages/:page',....)

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

    // Esempio
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.