Comment obtenir des variables GET (chaîne de requête) dans Express.js sur Node.js?

1193

Pouvons-nous obtenir les variables dans la chaîne de requête dans Node.js tout comme nous les obtenons $_GETdans PHP?

Je sais que dans Node.js, nous pouvons obtenir l'URL dans la demande. Existe-t-il une méthode pour obtenir les paramètres de la chaîne de requête?

X Men
la source
6
La réponse de @ whitequark (celle avec le plus de votes) doit être marquée comme la bonne réponse. Cela vous dérange-t-il de le mettre à jour pour les autres avec la même question que vous qui tombez sur votre question?
Dev01
Utilisez l'objet de requête dans la demande express - voici des exemples d'utilisation de la requête de demande express
drorw
@ Dev01 il n'est plus actif depuis 2014 lol
John Balvin Arias
Si vous cherchez un passe-partout API Nodejs avec Expressjs et MongoDB. Essayez ceci: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Réponses:

1183

Dans Express, c'est déjà fait pour vous et vous pouvez simplement utiliser req.query pour cela:

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

Sinon, dans NodeJS, vous pouvez accéder à req.url et au urlmodule intégré pour [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) manuellement:

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
Marcus Granström
la source
24
attention ici: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz
Quelles sont les fonctionnalités supplémentaires / améliorées fournies par hapi (le cas échéant)?
BaltoStar
180
Ceci est accepté mais ce n'est pas la réponse préférée. Voir ci-dessous! utilisationreq.query
Cheeso
2
La réponse de mikemcneil ci-dessous est un meilleur choix. Utilisez req.queryou req.param(ce qui est différent de req.params... voir ci-dessous.
MindJuice
9
-1 . Le code ci-dessus est un poids mort - quelque chose qu'un bon développeur refactorisera sur place. Il s'agit d'une réponse à « Comment obtenir la chaîne de requête d'une URL? » - l'URL en question se trouve juste être dans un objet nommé requestet n'a rien à voir avec Express. Voir la réponse de @ whitequark ci-dessous (utilisation request.query)
lunohodov
1649

Puisque vous avez mentionné Express.js dans vos balises, voici une réponse spécifique à Express: utilisez req.query . Par exemple

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

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

app.listen(3000);
whitequark
la source
68
Il convient de mentionner que vous devez utiliser req.query.id, pas besoin d'utiliser la notation entre crochets.
alex
Pour installer express, faites-le: oui | sudo npm install -g express --- J'ai essayé d'éditer mais Alexis King a été rétabli.
Felipe
dans la question, il cherchait un moyen d'obtenir tous les paramètres de chaîne de requête comme un tableau. La bonne réponse est la suivante: app.get ('/', fonction (req, res) {console.log (req.query);});
Richard Torcato
463

Dans Express, utilisez req.query.

req.paramsobtient uniquement les paramètres de route, pas les paramètres de chaîne de requête. Voir la documentation express ou voiles :

(req.params) Vérifie les paramètres de route, ex: / user /: id

(req.query) Vérifie les paramètres de chaîne de requête, ex:? id = 12 Vérifie les paramètres de corps encodés en url

(req.body), ex: id = 12 Pour utiliser les corps de requête encodés en url, req.body doit être un objet. Cela peut être fait en utilisant le middleware _express.bodyParser.

Cela dit, la plupart du temps, vous souhaitez obtenir la valeur d'un paramètre quelle que soit sa source. Dans ce cas, utilisez req.param('foo').

La valeur du paramètre sera renvoyée, que la variable se trouve dans les paramètres de route, la chaîne de requête ou le corps de demande codé.

Remarque - si vous visez à obtenir l'intersection des trois types de paramètres de demande (similaire à PHP $_REQUEST), il vous suffit de fusionner les paramètres - voici comment je l'ai configuré dans Sails . Gardez à l'esprit que l'objet paramètres de chemin / route ( req.params) a des propriétés de tableau, donc l'ordre est important (bien que cela puisse changer dans Express 4 )

mikermcneil
la source
req.param ('STRING') est la bonne réponse. Voir ici: stackoverflow.com/questions/17007997/… ( faites défiler vers le bas pour répondre en dessous de la réponse acceptée)
Joseph Juhnke
3
@deltab voici un lien vers req.paramsdans les documents Sails: sailsjs.org/#/documentation/reference/req/req.params.html et les nouveaux documents express: expressjs.com/4x/api.html#req.params
mikermcneil
7
req.param est déconseillé dans express 4.x, devrait utiliser req.params, req.body ou req.query à la place: expressjs.com/en/4x/api.html#req.param
swang
@swang a raison - j'ai revérifié récemment avec Doug Wilson à ce sujet, et la req.param()fonction d'assistance est susceptible d'être complètement supprimée dans Express 5. Cela ne sera imminent que plus tard en 2017, donc j'attendrai pour éditer cette réponse jusque-là. En attendant: il est sûr d'utiliser req.param()avec Express <= 3.x / Sails <= 0.12, et avec la dernière version disponible d'Express 4, bien qu'avec un message de journal de dépréciation. (Pour les utilisateurs de Sails: l'implémentation de req.param()deviendra un noyau à partir de Sails v1.0, et elle continuera à être entièrement prise en charge dans Sails à l'avenir.)
mikermcneil
142

Pour Express.js, vous voulez faire req.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});
Cris-O
la source
8
pour récupérer des variables GET dans express.js, vous pouvez utiliser req.query.
Ben Sinclair
6
@Andy req.params est meilleur car: req.param (nom [, par défaut]): Renvoie la valeur du nom du paramètre lorsqu'il est présent ou par défaut. Vérifie les paramètres de route (req.params), ex: / user /: id Vérifie les paramètres de chaîne de requête (req.query), ex:? Id = 12 Vérifie les paramètres de corps encodés en url (req.body), ex: id = 12 Pour utiliser la requête encodée en url corps, req.body devrait être un objet. Cela peut être fait en utilisant le middleware _express.bodyParser.
Cris-O
Je ne savais pas que req.param vérifie la requête de requête, merci pour cette note.
Ben Sinclair
3
req.param ('parameterName') recherchera req.body, req.query et req.params, mais si vous souhaitez que tous les paramètres de requête soient un objet, vous devez utiliser req.query.
mikermcneil
1
@mikermcneil vous avez probablement mélangé req.param () et req.params (object). Selon expressjs docs, req.param () recherche la valeur dans les trois objets. expressjs.com/api.html#req.param
Ben Sinclair
78

J'ai appris des autres réponses et j'ai décidé d'utiliser ce code sur tout mon site:

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

Ensuite, vous pouvez simplement appeler

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

où l'URL de get doit être

/path/filename?id=123&option=456
Grant Li
la source
2
l'identifiant et l'option ne seront-ils pas définis car la requête n'est qu'une chaîne? nous devons analyser les deux paramètres séparés avec une expression régulière ou similaire.
ossek
1
@ossek Je crois que le fait de causer parsesur les req.urlconvertis à un objet.
whitfin
1
@ossek, il a fourni true comme second argument à url.parse, ce qui fait pointer la propriété de requête vers un objet (et qui utilise en interne le module querystring), vous pouvez en trouver plus à ce sujet dans les docs [ici] ( nodejs.org/docs / dernier / api /… )
Bharat
A travaillé .... merci beaucoup !!!
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
la source
48

Si vous utilisez ES6 et Express , essayez cette destructuringapproche:

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

Dans le contexte:

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

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

app.listen(3000);

Vous pouvez également utiliser des valeurs par défaut avec 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
la source
Utilisation de la déstructuration d'objets avec des valeurs par défaut! +1
Développeur principal
43

Il y a 2 façons de passer des paramètres via la méthode GET

Méthode 1: L'approche MVC où vous passez les paramètres comme / routename /: paramname
Dans ce cas, vous pouvez utiliser req.params.paramname pour obtenir la valeur du paramètre. Par exemple, reportez-vous au code ci-dessous où je Je m'attends à ce que l'Id comme un
lien param soit comme: 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éthode 2: approche générale: transmission de variables sous forme de chaîne de requête à l'aide de «?» opérateur
Pour exemple se référer ci - dessous le code où je me attends Id comme paramètre de requête
lien pourrait ressembler: 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
la source
40

Vous devriez pouvoir faire quelque chose comme ceci:

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
la source
26

MISE À JOUR 4 mai 2014

Ancienne réponse conservée ici: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Installez 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) Exécutez l'application: node app.js

3) Visitez dans le navigateur: http://localhost:3000/endpoint?id=something

J'ai reçu l'ID: quelque chose


(beaucoup de choses ont changé depuis ma réponse et je crois qu'il vaut la peine de les mettre à jour)

Mars Robertson
la source
20

Un petit serveur HTTP Node.js écoute sur le port 9080, analyse les données GET ou POST et les renvoie au client dans le cadre de la réponse:

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

Enregistrez-le sous parse.jset exécutez-le sur la console en entrant "node parse.js".

adriano72
la source
3
vous n'avez pas besoin d'exiger sys dans cet exemple
danwellman
20

Whitequark a bien répondu. Mais avec les versions actuelles de Node.js et Express.js, cela nécessite une ligne de plus. Assurez-vous d'ajouter le 'require http' (deuxième ligne). J'ai publié un exemple plus complet ici qui montre comment cet appel peut fonctionner. Une fois en cours d'exécution, tapez http://localhost:8080/?name=abel&fruit=applevotre navigateur et vous obtiendrez une réponse sympa basée sur le code.

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
la source
15

C'est si simple:

Exemple d'URL:

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

Vous pouvez imprimer toutes les valeurs de la chaîne de requête en utilisant:

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

Production

Toutes les chaînes de requête: {"id": "3", "activatekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Pour imprimer spécifique:

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

Production

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

Saran Pal
la source
13

Vous pouvez utiliser

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

Vous pouvez utiliser avec express ^ 4.15.4:

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

J'espère que cela t'aides.

ajafik
la source
6

En express.jsvous pouvez l' obtenir assez facile, tout ce que vous devez faire dans votre fonction de contrôleur est:

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

Et c'est tout, en supposant que vous utilisez la syntaxe es6.

PD. {id}représente Object destructuringune nouvelle fonctionnalité es6.

Kevin Alemán
la source
J'utilise express avec node, donc cela a parfaitement fonctionné pour moi. Je vous remercie!
user752746
4
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

Vous pouvez l'utiliser ou essayer l'analyseur de corps pour analyser un élément spécial à partir des paramètres de la demande.

Mehedi Abdullah
la source
1
Pouvez-vous expliquer davantage comment cela répond à la question?
Nico Haase
Et comment cela analyse-t-il une liste de paramètres existante?
Nico Haase
vous pouvez utiliser le module body-parser de node.js
Mehedi Abdullah
1

C'est en fait 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
la source
0

vous pouvez utiliser le module url pour collecter des paramètres en utilisant url.parse

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

En expressjs c'est fait par,

var id = req.query.id;

Par exemple:

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
la source
0

Dans Express, nous pouvons simplement utiliser req.query.<name>. Cela fonctionne de la même manière qu'en $_GET['name']PHP.

Ankit Singh
la source
0

De mon point de vue, je pense que beaucoup de gens mélangent deux concepts différents. Pendant le développement REST, je connaissais la transmission d'informations dans l'URL de deux manières: "variables de chemin" et "paramètres de requête" (paramètres de requête). Le RFC décrit les parties de l'URI comme ceci: entrez la description du lien ici J'ai donc compris que l'auteur aimerait savoir comment passer les paramètres de demande. Je voudrais seulement rendre le sujet plus facile à comprendre, mais la solution a été mentionnée ici plusieurs fois.

Vous pouvez obtenir des paramètres de requête à partir de l'URI avec request.query.<name of the parameter>, la deuxième solution mentionnée était request.params.<name of the parameter>et avec cela, vous pouvez obtenir les variables de chemin.

Peter S.
la source
0

Donc, il y a deux façons de recevoir cet "id": 1) en utilisant des paramètres: les paramètres du code ressembleront à: Disons que nous avons un tableau,

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

Ensuite, pour les params, nous pouvons faire quelque chose comme:

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

2) Une autre méthode consiste à utiliser des paramètres de requête. ainsi l'url ressemblera à "..... \ api \ xyz? id = 1" où "? id = 1" est la partie de la requête. Dans ce cas, nous pouvons faire quelque chose comme:

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

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

app.listen(3000);
Sarthak Dalabehera
la source
0

Si vous avez besoin d'envoyer une GETdemande à un IPainsi qu'à Domain(d'autres réponses n'ont pas mentionné que vous pouvez spécifier une portvariable), vous pouvez utiliser cette fonction:

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

Ne manquez pas d'exiger des modules en haut de votre dossier:

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

Gardez également à l'esprit que vous pouvez utiliser le httpsmodule pour communiquer sur des domaines sécurisés et SSL. donc ces deux lignes changeraient:

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

pourquoi ne pas mélanger avec le code du serveur

par exemple . php

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

</script>
chings228
la source
-2

J'utilise MEANJS 0.6.0 avec [email protected], c'est bon

Client:

Manette:

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

prestations de service:

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

Serveur

itinéraires

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

manette

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

-------- Accès aux données de chaîne de requête -------
Supposons que ce soit le lien http://webapplog.com/search?term=node.js&page=1

Ainsi, en express, vous pouvez utiliser:

  • req.query.term
  • req.query.page ou
  • req.query(il récupérera la requête dans un objet)

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

-------- Accès aux paramètres d'URL -------
Supposons que ce soit le lien http://webapplog.com/node.js/pages/100
Donc en express vous pouvez utiliser: app.get('/:term/pages/:page',....)

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

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