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?

X Men
źródło
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;
Marcus Granström
źródło
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);
Whitequark
źródło
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 )

mikermcneil
źródło
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);    
});
Cris-O
źródło
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
Grant Li
źródło
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"}

})
główny szef
źródło
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)

Steven Spungin
źródło
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);
Omkar Bandkar
źródło
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")
})
RobertPitt
źródło
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ć)

Mars Robertson
źródło
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”.

adriano72
źródło
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'));
})
James d'angelo
źródło
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

Saran Pal
źródło
13

Możesz użyć

request.query.<varible-name>;
Yash Bele
źródło
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.

ajafik
źródło
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.

Kevin Alemán
źródło
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.

Mehedi Abdullah
źródło
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
Dr hab. A. Barik
źródło
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
});
Codemaker
źródło
0

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

Ankit Singh
źródło
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.

Peter S.
źródło
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);
});
abcbc
źródło
0
var express = require('express');
var app = express();

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

app.listen(3000);
Sarthak Dalabehera
źródło
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) => { ......
AmiNadimi
źródło
-1

dlaczego nie zmieszać z kodem serwera

np. php

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

</script>
chings228
źródło
-2

Używam MEANJS 0.6.0 z [email protected], 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
  ...
Tính Ngô Quang
źródło
-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}) })
Moulali M.
źródło