Jak uzyskać zmienne GET (ciąg zapytania) w Express.js na Node.js?


1190

Czy możemy uzyskać zmienne w ciągu zapytania w Node.js, tak jak $_GETw PHP?

Wiem, że w Node.js możemy uzyskać adres URL w żądaniu. Czy istnieje metoda uzyskania parametrów ciągu zapytania?


6
Odpowiedź @ whitequark (ta z największą liczbą głosów) powinna zostać oznaczona jako poprawna odpowiedź. Czy masz coś przeciwko aktualizacji dla innych z tym samym pytaniem, jakie napotykasz na twoje pytanie?
Dev01

Użyj obiektu zapytania w zapytaniu ekspresowym - oto przykłady użycia zapytania w trybie zapytania ekspresowego
drorw 18.04.19

@ Dev01 nie jest aktywny od 2014 lol
John Balvin Arias

Jeśli ktoś szuka płyty kotłowej API Nodejs z Expressjs i MongoDB. Spróbuj tego: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Odpowiedzi:


1178

W Express jest to już zrobione i możesz po prostu użyć req.query do tego:

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

W przeciwnym razie w NodeJS możesz uzyskać dostęp do req.url i wbudowanego urlmodułu do [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) ręcznie:

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

24
uwaga tutaj: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

Jakie dodatkowe / lepsze funkcje zapewnia hapi (jeśli w ogóle)?
BaltoStar,

180
Jest to akceptowane, ale nie jest to preferowana odpowiedź. Zobacz poniżej! użyciereq.query
Cheeso

2
Odpowiedź mikemcneil poniżej jest lepszym wyborem. Użyj req.querylub req.param(który jest inny niż req.params... patrz poniżej.
MindJuice

9
-1 . Powyższy kod jest martwy - coś, co dobry programista refaktoryzuje na miejscu. To jest odpowiedź na „ Jak uzyskać ciąg zapytania adresu URL? ” - dany adres URL po prostu znajduje się w obiekcie o nazwie requesti nie ma nic wspólnego z Express. Zobacz odpowiedź @ whitequark poniżej (użycie request.query)
lunohodov

1648

Ponieważ w tagach wspomniałeś o Express.js, oto odpowiedź specyficzna dla Express: użyj req.query . Na przykład

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

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

app.listen(3000);

67
Warto wspomnieć, że powinieneś używać req.query.id, nie musisz używać notacji nawiasowej.
alex

Aby zainstalować ekspres, zrób to: tak | sudo npm install -g express --- Próbowałem edytować, ale Alexis King został cofnięty.
Felipe

w pytaniu szukał sposobu na uzyskanie wszystkich parametrów ciągu zapytania, takich jak tablica. Prawidłowa odpowiedź to: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato,

463

W programie Express użyj req.query.

req.paramspobiera tylko parametry trasy, a nie parametry ciągu zapytania. Zobacz dokumentację ekspresową lub żagle :

(req.params) Sprawdza parametry trasy, np .: / user /: id

(req.query) Sprawdza parametry ciągu zapytania, np .:? id = 12 Sprawdza parametry ciała w urlencoded

(req.body), np .: id = 12 Aby korzystać z treści żądań zakodowanych w trybie url, req.body powinien być obiektem. Można to zrobić za pomocą oprogramowania pośredniego _express.bodyParser.

To powiedziawszy, przez większość czasu chcesz uzyskać wartość parametru niezależnie od jego źródła. W takim przypadku użyj req.param('foo').

Wartość parametru zostanie zwrócona bez względu na to, czy zmienna znajdowała się w parametrach trasy, ciągu zapytania lub w zakodowanym treści żądania.

Na marginesie - jeśli chcesz uzyskać przecięcie wszystkich trzech typów parametrów żądania (podobnych do PHP $_REQUEST), po prostu musisz połączyć parametry razem - oto jak to ustawiłem w Sails . Należy pamiętać, że obiekt path / route parameters ( req.params) ma właściwości tablicowe, więc kolejność ma znaczenie (chociaż może się to zmienić w Express 4 )


req.param („STRING”) to poprawna odpowiedź. Zobacz tutaj: stackoverflow.com/questions/17007997/... (przewiń w dół, aby odpowiedzieć poniżej zaakceptowanej odpowiedzi)
Joseph Juhnke

3
@deltab znajduje się link do req.paramsdokumentacji Sails: sailsjs.org/#/documentation/reference/req/req.params.html oraz nowych dokumentów ekspresowych: expressjs.com/4x/api.html#req.params
mikermcneil

7
req.param jest przestarzałe w express 4.x, zamiast tego należy użyć req.params, req.body lub req.query: expressjs.com/en/4x/api.html#req.param
swang

@swang ma rację - ostatnio dwukrotnie sprawdziłem w tej sprawie Douga Wilsona, a req.param()funkcja pomocnika prawdopodobnie zostanie całkowicie usunięta w Expressie 5. Nie będzie to możliwe wkrótce po 2017 roku, więc poczekam na edycję ta odpowiedź do tego czasu. Tymczasem: Można go bezpiecznie używać req.param()z Express <= 3.x / Sails <= 0,12 oraz z najnowszą dostępną wersją Express 4, aczkolwiek z komunikatem o wycofaniu. (Dla użytkowników Sails: Implementacja req.param()przeniesie się do rdzenia od Sails v1.0 i będzie nadal w pełni obsługiwana w Sails w przyszłości.)
mikermcneil

142

W przypadku Express.js chcesz req.params:

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

8
aby pobrać zmienne GET w express.js, możesz użyć req.query.
Ben Sinclair,

6
@Andy req.params jest lepszy, ponieważ: req.param (name [, default]): Zwróci wartość parametru param, jeśli jest obecny lub domyślny. Sprawdza parametry trasy (req.params), np .: / user /: id Sprawdza parametry ciągu zapytania (req.query), np:? Id = 12 Sprawdza parametry ciała urlencododowane (req.body), np .: id = 12 Aby użyć żądania urlencoded ciała, wymagane ciało powinno być przedmiotem. Można to zrobić za pomocą oprogramowania pośredniego _express.bodyParser.
Cris-O,

Nie wiedziałem, czy parametr req.param sprawdza, czy wymagane jest zapytanie, dzięki za tę notatkę.
Ben Sinclair,

3
req.param ('nazwa_parametru') sprawdzi, czy wymagane.body, req.query i req.params, ale jeśli chcesz wszystkie parametry zapytania jako obiekt, powinieneś użyć req.query.
mikermcneil

1
@mikermcneil prawdopodobnie pomieszałeś req.param () i req.params (obiekt). Zgodnie z docs expresss req.param () szuka wartości we wszystkich trzech obiektach. expressjs.com/api.html#req.param
Ben Sinclair

78

Nauczyłem się z innych odpowiedzi i postanowiłem używać tego kodu w całej witrynie:

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

Następnie możesz po prostu zadzwonić

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

gdzie powinien znajdować się adres URL get

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

2
czy identyfikator i opcja nie zostaną zdefiniowane, ponieważ zapytanie jest tylko ciągiem znaków? musielibyśmy przeanalizować dwa oddzielne parametry za pomocą wyrażenia regularnego lub podobnego.
ossek

1
@ossek wierzę akt powodując parsena req.urlnawróconych do obiektu.
whitfin

1
@ossek, podał prawdę jako drugi argument do adresu url.parse, który powoduje, że właściwość zapytania wskazuje na obiekt (i który wewnętrznie korzysta z modułu kwerendowego), więcej informacji na ten temat można znaleźć w dokumentacji [tutaj] ( nodejs.org/docs / latest / api /… )
Bharat

Pracowałem .... wielkie dzięki !!!
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

Jeśli używasz ES6 i Express , wypróbuj to destructuringpodejście:

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

W kontekście:

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

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

app.listen(3000);

Możesz również użyć wartości domyślnych z 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)


Używanie destrukcji obiektów z wartościami domyślnymi! +1
Główny programista

43

Istnieją 2 sposoby przekazywania parametrów za pomocą metody GET

Metoda 1: Podejście MVC, w którym przekazujesz parametry takie jak / routeename /: paramname
W tym przypadku możesz użyć req.params.paramname, aby uzyskać wartość parametru Na przykład zapoznaj się z poniższym kodem, w którym I oczekuję, że identyfikator jako param
link może wyglądać tak: 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);

Metoda 2: Podejście ogólne: przekazywanie zmiennych jako ciągu zapytania za pomocą „?” operator
Na przykład zapoznaj się z poniższym kodem, w którym oczekuję, że identyfikator jako parametr parametru zapytania
może wyglądać tak: 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

Powinieneś być w stanie zrobić coś takiego:

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

AKTUALIZACJA 4 maja 2014 r

Stara odpowiedź została zachowana tutaj: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Zainstaluj ekspresowe: 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) Uruchom aplikację: node app.js

3) Odwiedź w przeglądarce: http://localhost:3000/endpoint?id=something

Otrzymałem identyfikator: coś


(wiele rzeczy zmieniło się od mojej odpowiedzi i uważam, że warto je aktualizować)


20

Mały serwer HTTP Node.js nasłuchujący na porcie 9080, analizujący dane GET lub POST i wysyłający go z powrotem do klienta w ramach odpowiedzi to:

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

Zapisz go jako parse.jsi uruchom na konsoli, wpisując „node parse.js”.


3
w tym przykładzie nie musisz wymagać systemu
danwellman

20

Whitequark odpowiedziała ładnie. Ale w obecnych wersjach Node.js i Express.js wymaga jeszcze jednej linii. Pamiętaj, aby dodać „wymagaj http” (drugi wiersz). Zamieściłem tutaj pełniejszy przykład, który pokazuje, jak to połączenie może działać. Po uruchomieniu wpisz http://localhost:8080/?name=abel&fruit=applew przeglądarce, a otrzymasz fajną odpowiedź na podstawie kodu.

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

To takie proste:

Przykładowy adres URL:

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

Możesz wydrukować wszystkie wartości ciągu zapytania, używając:

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

Wynik

Wszystkie ciągi zapytań: {"id": "3", "activatekey": "2 $ 08 USD $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Aby wydrukować konkretny:

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

Wynik

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



13

Możesz używać z ekspresowym ^ 4.15.4:

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

Mam nadzieję że to pomoże.


6

Aby express.jsuzyskać całkiem proste, wszystko, co musisz zrobić w funkcji kontrolera, to:

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

I to wszystko, zakładając, że używasz składni es6.

PD. {id}oznacza Object destructuringnową funkcję es6.


Używam express z węzłem, więc to działało idealnie dla mnie. Dziękuję Ci!
user752746,

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

Możesz użyć tego lub możesz wypróbować body-parser do parsowania specjalnego elementu z parametrów żądania.


1
Czy możesz wyjaśnić, jak to odpowiada na pytanie?
Nico Haase

Jak to analizuje istniejącą listę parametrów?
Nico Haase

możesz użyć modułu parsera ciała z node.js
Mehedi Abdullah

1

To naprawdę proste:

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

możesz użyć modułu url do zbierania parametrów za pomocą url.parse

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

W expressjs odbywa się to przez

var id = req.query.id;

Na przykład:

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

W Express możemy po prostu użyć req.query.<name>. Działa tak samo jak $_GET['name']w PHP.


0

Z mojego punktu widzenia uważam, że wiele osób łączy dwie różne koncepcje. Podczas tworzenia REST znałem przekazywanie informacji w adresie URL na dwa sposoby: „zmienne ścieżki” i „parametry żądania” (parametry zapytania). RFC opisuje części URI w ten sposób: wpisz opis linku tutaj Więc zrozumiałem, że autor chciałby wiedzieć, jak przekazać parametry żądania. Chciałbym tylko, aby ten temat był łatwiejszy do zrozumienia, ale rozwiązanie zostało tu wspomniane wiele razy.

Możesz uzyskać parametry zapytania z URI request.query.<name of the parameter>, drugim wspomnianym rozwiązaniem było request.params.<name of the parameter>i dzięki temu możesz uzyskać zmienne ścieżki.


0

Istnieją dwa sposoby otrzymania tego „identyfikatora”: 1) przy użyciu parametrów: parametry kodu będą wyglądały mniej więcej tak: Powiedzmy, że mamy tablicę,

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

Następnie dla parametrów możemy zrobić coś takiego:

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

2) Inną metodą jest użycie parametrów zapytania. więc adres URL będzie wyglądał mniej więcej tak: „..... \ api \ xyz? id = 1” gdzie „? id = 1” to część zapytania. W tym przypadku możemy zrobić coś takiego:

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

Jeśli kiedykolwiek będziesz musiał wysłać GETzapytanie do ( IPa także w Domaininnych odpowiedziach nie wspomniano, że możesz podać portzmienną), możesz skorzystać z tej funkcji:

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

Nie przegap wymaganych modułów na górze pliku:

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

Pamiętaj też, że możesz używać httpsmodułu do komunikacji przez bezpieczne domeny i ssl. więc te dwie linie zmieniłyby się:

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

-1

dlaczego nie zmieszać z kodem serwera

np. php

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

</script>

-2

Używam MEANJS 0.6.0 z express@4.16, to dobrze

Klient:

Kontroler:

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

usługi:

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

serwer

trasy

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

kontroler

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

-3

-------- Dostęp do danych ciągu zapytania -------
Załóżmy, że jest to link http://webapplog.com/search?term=node.js&page=1

W ekspresowym trybie możesz użyć:

  • req.query.term
  • req.query.page lub
  • req.query(pobierze zapytanie do obiektu)

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

-------- Uzyskiwanie dostępu do parametrów adresu URL -------
Załóżmy, że jest to link http://webapplog.com/node.js/pages/100
Tak więc możesz użyć: app.get('/:term/pages/:page',....)

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

    // Przykład
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.