Wie bekomme ich GET-Variablen (Query String) in Express.js auf Node.js?


1193

Können wir die Variablen in der Abfragezeichenfolge in Node.js genauso abrufen wie $_GETin PHP?

Ich weiß, dass wir in Node.js die URL in der Anfrage erhalten können. Gibt es eine Methode, um die Parameter der Abfragezeichenfolge abzurufen?


6
Die Antwort von @ whitequark (die mit den meisten Stimmen) sollte als die richtige Antwort markiert werden. Haben Sie etwas dagegen, es für andere mit der gleichen Frage wie Sie zu aktualisieren, die über Ihre Frage stolpern?
Dev01

Verwenden Sie das Abfrageobjekt in Express-Anfrage - hier sind Beispiele mit Express-Anfrage-Abfrage
am

@ Dev01 er ist seit 2014 nicht mehr aktiv lol
John Balvin Arias

Wenn jemand nach Nodejs API Boilerplate mit Expressjs und MongoDB sucht. Versuchen Sie dies: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Antworten:


1182

In Express ist es bereits für Sie erledigt und Sie können einfach req.query dafür verwenden:

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

Andernfalls können Sie in NodeJS manuell auf req.url und das integrierte urlModul zugreifen, um [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) manuell:

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

24
Aufmerksamkeit hier: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

Welche zusätzlichen / besseren Funktionen bietet Hapi (falls vorhanden)?
BaltoStar

180
Dies wird akzeptiert, ist aber nicht die bevorzugte Antwort. Siehe unten! verwendenreq.query
Cheeso

2
Die Antwort von mikemcneil unten ist eine bessere Wahl. Verwenden Sie req.queryoder req.param(was anders ist als req.params... siehe unten.
MindJuice

9
-1 . Der obige Code ist ein Deadweight - etwas, das ein guter Entwickler sofort umgestalten wird. Dies ist eine Antwort auf " Wie erhalte ich die Abfragezeichenfolge einer URL? " - Die betreffende URL befindet sich zufällig in einem Objekt mit dem Namen requestund hat nichts mit Express zu tun. Siehe @ Whitequarks Antwort unten (Verwendung request.query)
Lunohodov

1649

Da Sie Express.js in Ihren Tags erwähnt haben, finden Sie hier eine Express-spezifische Antwort: Verwenden Sie req.query . Z.B

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

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

app.listen(3000);

68
Erwähnenswert ist, dass Sie req.query.iddie Klammer-Notation verwenden sollten.
alex

Um Express zu installieren, machen Sie es: yes | sudo npm install -g express --- Ich habe versucht zu bearbeiten, aber Alexis King wurde zurückgesetzt.
Felipe

In der Frage suchte er nach einer Möglichkeit, alle Parameter der Abfragezeichenfolge wie ein Array abzurufen. Die richtige Antwort lautet: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato

463

Verwenden Sie in Express req.query .

req.paramsRuft nur die Routenparameter ab, nicht die Parameter der Abfragezeichenfolge. Siehe die Express- oder Segeldokumentation :

(req.params) Überprüft die Routenparameter, z. B.: / user /: id

(req.query) Überprüft Abfragezeichenfolgenparameter, z. B.:? id = 12 Überprüft urlencodierte Körperparameter

(req.body), Beispiel: id = 12 Um urlencodierte Anforderungskörper zu verwenden, sollte req.body ein Objekt sein. Dies kann mithilfe der Middleware _express.bodyParser erfolgen.

Meistens möchten Sie jedoch den Wert eines Parameters unabhängig von seiner Quelle abrufen. In diesem Fall verwendenreq.param('foo') .

Der Wert des Parameters wird zurückgegeben, unabhängig davon, ob sich die Variable in den Routenparametern, der Abfragezeichenfolge oder dem codierten Anforderungshauptteil befand.

Randnotiz: Wenn Sie den Schnittpunkt aller drei Arten von Anforderungsparametern (ähnlich wie bei PHPs) ermitteln möchten $_REQUEST, müssen Sie nur die Parameter zusammenführen. So habe ich sie in Sails eingerichtet . Beachten Sie, dass die Pfad- / Routenparameter object ( req.params) Array-Eigenschaften haben, daher ist die Reihenfolge wichtig (obwohl sich dies in Express 4 ändern kann ).


req.param ('STRING') ist die richtige Antwort. Siehe hier: stackoverflow.com/questions/17007997/… (scrollen Sie nach unten, um unter der akzeptierten Antwort zu antworten)
Joseph Juhnke

3
@deltab Hier ist ein Link zu req.paramsden Sails-Dokumenten: sailsjs.org/#/documentation/reference/req/req.params.html und den neuen Express-Dokumenten: expressjs.com/4x/api.html#req.params
mikermcneil

7
req.param ist in Express 4.x veraltet, sollte stattdessen req.params, req.body oder req.query verwenden: expressjs.com/en/4x/api.html#req.param
swang

@swang ist richtig - ich habe kürzlich mit Doug Wilson darüber gesprochen, und die Hilfsfunktion wird req.param()wahrscheinlich in Express 5 vollständig entfernt. Dies wird erst einige Zeit später im Jahr 2017 unmittelbar bevorstehen, daher werde ich mit der Bearbeitung warten diese Antwort bis dahin. In der Zwischenzeit: Die Verwendung req.param()mit Express <= 3.x / Sails <= 0.12 und mit der neuesten verfügbaren Version von Express 4 ist sicher , wenn auch mit einer Meldung über das Verfallsprotokoll. (Für Sails-Benutzer: Die Implementierung von req.param()wird ab Sails v1.0 in den Kern verschoben und wird auch in Zukunft in Sails vollständig unterstützt.)
mikermcneil

142

Für Express.js möchten Sie Folgendes tun req.params:

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

8
Um GET-Variablen in express.js abzurufen, können Sie req.query verwenden.
Ben Sinclair

6
@Andy req.params ist besser, weil: req.param (name [, default]): den Wert des Parameternamens zurückgibt, wenn vorhanden oder standardmäßig. Überprüft Routenparameter (req.params), Beispiel: / user /: id Überprüft Abfragezeichenfolgenparameter (req.query), Beispiel :? Id = 12Überprüft urlencodierte Körperparameter (req.body), Beispiel: id = 12 Um urlencodierte Anforderung zu verwenden Körper, req.body sollte ein Objekt sein. Dies kann mithilfe der Middleware _express.bodyParser erfolgen.
Cris-O

Ich wusste nicht, dass req.param nach req.query sucht, danke für diesen Hinweis.
Ben Sinclair

3
req.param ('parameterName') sucht nach req.body, req.query und req.params. Wenn Sie jedoch alle Abfrageparameter als Objekt verwenden möchten, sollten Sie req.query verwenden.
Mikermcneil

1
@mikermcneil Sie haben wahrscheinlich req.param () und req.params (Objekt) verwechselt. Laut expressjs docs sucht req.param () in allen drei Objekten nach Wert. expressjs.com/api.html#req.param
Ben Sinclair

78

Ich habe aus den anderen Antworten gelernt und mich entschieden, diesen Code auf meiner Website zu verwenden:

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

Dann können Sie einfach anrufen

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

wo sollte die URL für get sein

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

2
Werden ID und Option nicht undefiniert sein, da die Abfrage nur eine Zeichenfolge ist? Wir müssten die beiden separaten Parameter mit einem regulären Ausdruck oder ähnlichem analysieren.
Ossek

1
@ossek Ich glaube , den Akt der Verursachung parseauf req.urlKonvertiten zu einem Objekt.
Whitfin

1
@ossek, er hat true als zweites Argument für url.parse angegeben, wodurch die Abfrageeigenschaft auf ein Objekt verweist (und das intern das Querystring-Modul verwendet). Weitere Informationen finden Sie in den Dokumenten [hier] ( nodejs.org/docs) / spätestens / api /… )
Bharat

Hat funktioniert .... vielen Dank !!!
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

Wenn Sie ES6 und Express verwenden , versuchen Sie diesen destructuringAnsatz:

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

Im Zusammenhang:

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

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

app.listen(3000);

Sie können auch Standardwerte verwenden mit 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)


Objektzerstörung mit Standardwerten verwenden! 1
Lead Developer

43

Es gibt zwei Möglichkeiten, Parameter über die GET-Methode zu übergeben.

Methode 1: Der MVC-Ansatz, bei dem Sie die Parameter wie / routename /: paramname übergeben.
In diesem Fall können Sie req.params.paramname verwenden, um den Parameterwert abzurufen Ich erwarte, dass die ID als Parameter-
Link wie folgt lautet : 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);

Methode 2: Allgemeiner Ansatz: Übergeben von Variablen als Abfragezeichenfolge mit '?' Operator
Zum Beispiel verweisen
wir auf den folgenden Code, in dem ich eine ID als Abfrageparameter- Link erwarte : 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

Sie sollten in der Lage sein, so etwas zu tun:

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

UPDATE 4. Mai 2014

Alte Antwort hier erhalten: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Installieren Sie 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) Führen Sie die App aus: node app.js

3) Besuchen Sie im Browser: http://localhost:3000/endpoint?id=something

Ich habe den Ausweis erhalten: etwas


(Viele Dinge haben sich seit meiner Antwort geändert und ich glaube, es lohnt sich, die Dinge auf dem neuesten Stand zu halten.)


20

Ein kleiner HTTP-Server von Node.js, der Port 9080 überwacht, GET- oder POST-Daten analysiert und als Teil der Antwort an den Client zurücksendet, lautet:

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

Speichern Sie es als parse.jsund führen Sie es auf der Konsole aus, indem Sie "node parse.js" eingeben.


3
In diesem Beispiel benötigen Sie kein
System

20

Whitequark reagierte nett. Bei den aktuellen Versionen von Node.js und Express.js ist jedoch eine weitere Zeile erforderlich. Stellen Sie sicher, dass Sie das 'require http' (zweite Zeile) hinzufügen. Ich habe hier ein ausführlicheres Beispiel veröffentlicht, das zeigt, wie dieser Aufruf funktionieren kann. Geben Sie nach dem Ausführen http://localhost:8080/?name=abel&fruit=appleIhren Browser ein und Sie erhalten eine coole Antwort basierend auf dem 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'));
})

15

Es ist so einfach:

Beispiel-URL:

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

Sie können alle Werte der Abfragezeichenfolge drucken, indem Sie Folgendes verwenden:

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

Ausgabe

Alle Abfragezeichenfolgen: {"id": "3", "enabledkey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

So drucken Sie spezifisch:

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

Ausgabe

Aktivierungsschlüssel: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK



13

Sie können mit Express ^ 4.15.4 verwenden:

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

Hoffe das hilft.


6

In express.jsSie es recht einfach zu bekommen, alles , was Sie in Ihrer Controller - Funktion tun müssen , ist:

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

Und das ist alles, vorausgesetzt, Sie verwenden die es6-Syntax.

PD. {id}steht für Object destructuringeine neue es6-Funktion.


Ich verwende Express mit Knoten, daher hat dies für mich perfekt funktioniert. Vielen Dank!
user752746

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

Sie können dies verwenden oder Body-Parser ausprobieren, um spezielle Elemente aus den Anforderungsparametern zu analysieren.


1
Können Sie weiter erklären, wie dies die Frage beantwortet?
Nico Haase

Und wie analysiert dies eine vorhandene Parameterliste?
Nico Haase

Sie können das Body-Parser-Modul von node.js
Mehedi Abdullah

1

Es ist eigentlich ganz einfach:

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

Sie können das URL-Modul verwenden, um Parameter mithilfe von url.parse zu erfassen

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

In Expressjs wird es gemacht von,

var id = req.query.id;

Z.B:

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 können wir einfach verwenden req.query.<name>. Es funktioniert genauso wie $_GET['name']in PHP.


0

Aus meiner Sicht denke ich, dass viele Menschen zwei verschiedene Konzepte mischen. Während der REST-Entwicklung war ich mit der Übergabe von Informationen in der URL auf zwei Arten vertraut: "Pfadvariablen" und "Anforderungsparameter" (Abfrageparameter). Der RFC beschreibt die Teile des URI folgendermaßen: Geben Sie hier die Linkbeschreibung ein Daher habe ich verstanden, dass der Autor wissen möchte, wie Anforderungsparameter übergeben werden. Ich möchte das Thema nur verständlicher machen, aber die Lösung wurde hier oft erwähnt.

Sie können Abfrageparameter vom URI mit abrufen request.query.<name of the parameter>, die zweitgenannte Lösung war request.params.<name of the parameter>und mit diesem können Sie die Pfadvariablen abrufen.


0

Es gibt also zwei Möglichkeiten, wie diese "ID" empfangen werden kann: 1) Verwenden von Parametern: Die Code-Parameter sehen ungefähr so ​​aus: Angenommen, wir haben ein Array,

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

Dann können wir für Parameter so etwas tun:

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

2) Eine andere Methode ist die Verwendung von Abfrageparametern. Die URL sieht also ungefähr so ​​aus wie "..... \ api \ xyz? id = 1", wobei "? id = 1" der Abfrageteil ist. In diesem Fall können wir so etwas tun:

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

Wenn Sie jemals eine GETAnfrage an eine IPoder eine senden müssen Domain(andere Antworten haben nicht erwähnt, dass Sie eine portVariable angeben können), können Sie diese Funktion verwenden:

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

Verpassen Sie nicht, Module oben in Ihrer Datei zu benötigen:

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

Denken Sie auch daran, dass Sie das httpsModul für die Kommunikation über gesicherte Domänen und SSL verwenden können. Diese beiden Zeilen würden sich also ändern:

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

-1

warum nicht mit Servercode gemischt

z.B . php

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

</script>

-2

Ich benutze MEANJS 0.6.0 mit express@4.16, es ist gut

Klient:

Regler:

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

Dienstleistungen:

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

Server

Routen

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

Regler

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

-3

-------- Zugriff auf Abfragezeichenfolgendaten -------
Angenommen, dies ist der Link http://webapplog.com/search?term=node.js&page=1

Im Express können Sie also Folgendes verwenden:

  • req.query.term
  • req.query.page oder
  • req.query(Die Abfrage wird in einem Objekt abgerufen.)

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

-------- Zugriff auf URL-Parameter -------
Angenommen, dies ist der Link http://webapplog.com/node.js/pages/100.
In Express können Sie also Folgendes verwenden: app.get('/:term/pages/:page',....)

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

    // Beispiel
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.