Node.js üzerinde Express.js'de GET (sorgu dizesi) değişkenleri nasıl alınır?


1192

Değişkenleri tıpkı $_GETPHP'de içeriyormuş gibi Node.js'deki sorgu dizesinde alabilir miyiz ?

Node.js'de URL'yi istekte alabileceğimizi biliyorum. Sorgu dizesi parametrelerini almak için bir yöntem var mı?


6
@ whitequark'ın cevabı (en çok oyu alan kişi) doğru cevap olarak işaretlenmelidir. Sorunuzla karşılaşmakla aynı soruyu başkaları için güncellemeyi düşünür müsünüz?
Dev01

Hızlı istekte sorgu nesnesini kullanın - burada hızlı istek sorgusu kullanan örnekler
drorw

@ Dev01 2014'ten beri aktif değil lol
John Balvin Arias

Expressjs ve MongoDB ile Nodejs API kazanı arayan herkes varsa. Bunu deneyin: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Yanıtlar:


1181

Express'te zaten sizin için yapılır ve bunun için req.query'yi kullanabilirsiniz :

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

Aksi takdirde, NodeJS'de req.url ve yerleşik urlmodüle [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) adresinden manuel olarak erişebilirsiniz :

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

24
Burada dikkat: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

Hapi (varsa) hangi ek / daha iyi işlevselliği sağlar?
BaltoStar

180
Bu kabul edilir, ancak tercih edilen cevap değildir. Aşağıya bakınız! kullanımıreq.query
Cheeso

2
mikemcneil'in cevabı aşağıda daha iyi bir seçimdir. Kullanın req.queryveya req.param(hangisinden farklı req.params... aşağıya bakın.)
MindJuice

9
-1 . Yukarıdaki kod bir ölü ağırlıktır - iyi bir geliştiricinin yerinde yeniden düzenleyeceği bir şey. Bu, " Bir URL'nin sorgu dizesi nasıl alınır? " Sorusunun cevabıdır - söz konusu URL'nin sadece adlı bir nesnede olması requestve Express ile ilgisi yoktur. Aşağıdaki @ whitequark'ın cevabına bakınız (kullanım request.query)
lunohodov

1649

Etiketlerinizde Express.js'den bahsettiğinizden, işte Express'e özgü bir cevap: req.query kullanın . Örneğin

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

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

app.listen(3000);

68
Kullanmanız gerektiğini belirtmek gerekir req.query.id, parantez notasyonu kullanmaya gerek yoktur.
alex

Ekspres yüklemek için yapın: evet | sudo npm install -g express --- Düzenlemeye çalıştım ama Alexis King geri döndü.
Felipe

soruda bir dizi gibi tüm sorgu dizesi parametrelerini almanın bir yolunu arıyordu. Doğru cevap şudur: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato

463

Express'te kullanın req.query.

req.paramsyalnızca rota parametrelerini alır, sorgu dizesi parametrelerini değil. Bkz ekspres veya yelkenler belgelerine:

(req.params) Güzergah parametrelerini kontrol eder, örn: / user /: id

(req.query) Sorgu dizesi parametrelerini denetler, örn .:? id = 12 urlencoded gövde parametrelerini denetler

(req.body), ex: id = 12 Urlencocode istek gövdelerini kullanmak için req.body bir nesne olmalıdır. Bu, _express.bodyParser ara katman yazılımı kullanılarak yapılabilir.

Bununla birlikte, çoğu zaman kaynağından bağımsız olarak bir parametrenin değerini almak istersiniz. Bu durumda, kullanın req.param('foo').

Değişkenin rota parametreleri, sorgu dizesi veya kodlanmış istek gövdesinde olması durumunda parametrenin değeri döndürülür.

Yan not - üç tür istek parametresinin (PHP'lere benzer $_REQUEST) tümünün kesişimini almayı hedefliyorsanız , parametreleri birlikte birleştirmeniz gerekir - işte bunu Sails'te nasıl ayarladığım . Yol / rota parametreleri nesnesinin ( req.params) dizi özelliklerine sahip olduğunu unutmayın, bu nedenle sipariş önemlidir ( Express 4'te değişse de )


req.param ('STRING') doğru cevaptır. Buraya bakın: stackoverflow.com/questions/17007997/… (kabul edilen cevabın altında cevaplamak için aşağı kaydırın)
Joseph Juhnke

3
@ deltab burada req.paramsSails belgelerinde bir bağlantı vardır : sailsjs.org/#/documentation/reference/req/req.params.html ve yeni hızlı dokümanlar: expressjs.com/4x/api.html#req.params
mikermcneil

7
req.param req.params, req.body veya req.query yerine kullanması gereken, ekspres 4.x önerilmiyor: expressjs.com/en/4x/api.html#req.param
swang

@swang haklı - Doug Wilson ile bu konuyla ilgili son zamanlarda iki kez kontrol ettim ve req.param()yardımcı işlev Express 5'te tamamen kaldırılacak. Bu, 2017'de bir süre geçene kadar yakın olmayacak, bu yüzden düzenlemek için bekleyeceğim bu cevabı o zamana kadar. Bu arada: Kullanımı güvenlidir req.param()Express ile <= 3.x / Yelken <= 0.12, ve w / a kullanımdan kaldırılması günlüğüne mesajla olsa Express 4'ün en son sürümü ile. (Sails kullanıcıları için: Sails v1.0'dan itibaren uygulanması req.param()çekirdek haline gelecek ve gelecekte
Sails'te

142

Express.js için şunları yapmak istiyorsunuz req.params:

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

8
express.js'deki GET değişkenlerini almak için req.query kullanabilirsiniz.
Ben Sinclair

6
@Andy req.params daha iyidir çünkü: req.param (name [, default]): Parametre adının değerini mevcut veya varsayılan olarak döndürür. Rota parametrelerini (req.params) denetler, ex: / user /: id Sorgu dizesi parametrelerini (req.query) denetler, ex:? İd = 12 urlencoded body parametrelerini (req.body) den, ex: id = 12 urlencoded isteğini kullanmak için beden, req.body bir nesne olmalı. Bu, _express.bodyParser ara katman yazılımı kullanılarak yapılabilir.
Cris-O

Req.param req.query için kontrol bilmiyordum, bu not için teşekkürler.
Ben Sinclair

3
req.param ('parametreAdı') req.body, req.query ve req.params değerlerini kontrol eder, ancak tüm sorgu parametrelerini nesne olarak istiyorsanız, req.query kullanmalısınız.
mikermcneil

1
@mikermcneil muhtemelen req.param () ve req.params (object) 'i karıştırdınız. Expressjs'e göre docs req.param () her üç nesnede de değer arar. expressjs.com/api.html#req.param
Ben Sinclair

78

Diğer cevaplardan öğrendim ve bu kodu sitem boyunca kullanmaya karar verdim:

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

Sonra sadece

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

get için URL nerede olmalıdır

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

2
sorgu sadece bir dize olduğundan id ve seçenek tanımsız olmaz mı? iki ayrı parametreyi bir regex veya benzeri ile ayrıştırmamız gerekir.
ossek

1
@ossek I neden hareket inanıyoruz parseüzerinde req.urlbir nesneye dönüştürür.
whitfin

1
@ossek, sorgu özelliğini bir nesneye işaret eden (ve dahili olarak sorgu dizesi modülünü kullanan) url.parse için ikinci bir argüman olarak doğrudur, dokümanlarda [burada] ( nodejs.org/docs) / latest / api /… )
Bharat

Çalıştı .... çok teşekkürler !!!
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

ES6 ve Express kullanıyorsanız bu destructuringyaklaşımı deneyin :

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

Bağlamda:

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

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

app.listen(3000);

Varsayılan değerleri destructuringde şu şekilde kullanabilirsiniz :

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


Nesne imhasını varsayılan değerlerle kullanma! +1
Baş Geliştirici

43

GET yöntemi

ile parametreleri iletmenin 2 yolu vardır. Yöntem 1: / routename /: paramname gibi parametreleri ilettiğiniz MVC yaklaşımı
Bu durumda parametre değerini almak için req.params.paramname kullanabilirsiniz. Param
bağlantısı olarak Id bekliyorum : 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);

Yöntem 2: Genel yaklaşım: Değişkenleri sorgu dizesi olarak '?' Operatör
Örneğin, id parametresini sorgu parametre
bağlantısı olarak beklediğim aşağıdaki koda bakın : 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

Bunun gibi bir şey yapabilmelisiniz:

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

GÜNCELLEME 4 Mayıs 2014

Eski cevap burada korunmuştur: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) ekspres yükleyin: 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) Uygulamayı çalıştırın: node app.js

3) Tarayıcıyı ziyaret edin: http://localhost:3000/endpoint?id=something

Kimliği aldım: bir şey


(Cevabımdan beri birçok şey değişti ve inanıyorum ki her şeyi güncel tutmaya değer)


20

9080 numaralı bağlantı noktasını dinleyen, GET veya POST verilerini ayrıştıran ve yanıtın bir parçası olarak istemciye geri gönderen küçük bir Node.js HTTP sunucusu:

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

Farklı kaydedin parse.jsve "node parse.js" girerek konsolda çalıştırın.


3
bu örnekte sys istemeniz gerekmez
danwellman

20

Whitequark güzel cevap verdi. Ancak Node.js ve Express.js'nin mevcut sürümlerinde bir satır daha gerekiyor. 'Gereken http' (ikinci satır) eklediğinizden emin olun. Bu aramanın nasıl çalışabileceğini gösteren daha dolu bir örnek yayınladım. Çalıştırdıktan sonra http://localhost:8080/?name=abel&fruit=appletarayıcınıza yazın , koda göre harika bir yanıt alırsınız.

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

Çok basit:

Örnek URL:

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

Sorgu dizesinin tüm değerlerini kullanarak şunları yazdırabilirsiniz:

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

Çıktı

Tüm sorgu dizeleri: {"id": "3", "activatekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Belirli yazdırmak için:

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

Çıktı

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



13

Ekspres ^ 4.15.4 ile kullanabilirsiniz:

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

Bu yardımcı olur umarım.


6

Gelen express.jsoldukça kolay elde edebilirsiniz, size denetleyici işlevi yapmanız gereken tek şey:

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

Ve hepsi bu, es6 sözdizimi kullandığınızı varsayarsak.

PD. {id}açılımı Object destructuringyeni bir ES6 özelliği.


Bu benim için mükemmel çalıştı bu yüzden düğüm ile ekspres kullanıyorum. Teşekkür ederim!
user752746

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

Bunu kullanabilir veya istek parametrelerinden özel öğeyi ayrıştırmak için gövde ayrıştırıcısını deneyebilirsiniz.


1
Bunun soruyu nasıl cevapladığını daha fazla açıklayabilir misiniz?
Nico Haase

Ve bu mevcut bir parametre listesini nasıl ayrıştırır?
Nico Haase

body-parser modülünü node.js adresinden kullanabilirsiniz
Abdullah

1

Aslında basit:

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

url.parse komutunu kullanarak parametreleri toplamak için url modülünü kullanabilirsiniz

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

Ekspreslerde,

var id = req.query.id;

Örneğin:

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

Express'te sadece kullanabiliriz req.query.<name>. $_GET['name']PHP ile aynı çalışır .


0

Benim açımdan, birçok insanın iki farklı kavramı karıştırdığını düşünüyorum. REST geliştirme sırasında, URL'de bilgileri iki yolla "yol değişkenleri" ve "istek parametreleri" (sorgu parametreleri) ile aktarmayı öğrendim. RFC URI bu gibi bölümlerini açıklar: bağlantı açıklamasını buraya girin Bu yüzden yazarın istek parametrelerini nasıl geçeceğini bilmek istediğini anladım. Konuyu sadece daha kolay anlaşılır hale getirmek istiyorum, ancak çözüm burada birçok kez belirtildi.

Sorgu parametrelerini URI'den alabilirsiniz request.query.<name of the parameter>, bahsedilen ikinci çözüm buydu request.params.<name of the parameter>ve bununla yol değişkenlerini alabilirsiniz.


0

Yani, bu "id" in alınabilmesinin iki yolu vardır: 1) params kullanarak: kod params gibi bir şeye benzeyecektir: Bir dizimiz var diyelim,

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

Sonra params için şöyle bir şey yapabiliriz:

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

2) Başka bir yöntem de sorgu parametrelerini kullanmaktır. bu nedenle url, "..... \ api \ xyz? id = 1" gibi bir şeye benzeyecektir; burada "? id = 1" sorgu kısmıdır. Bu durumda şöyle bir şey yapabiliriz:

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

Bir seçeneğin yanı sıra bir GETistek de göndermeniz gerekiyorsa (Diğer yanıtlar bir değişken belirtebileceğinizden bahsetmedi ), bu işlevi kullanabilirsiniz:IPDomainport

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

Dosyanızın üst kısmında modül istemeyi kaçırmayın:

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

Ayrıca https, güvenli alanlar ve SSL üzerinden iletişim kurmak için modülü kullanabileceğinizi de unutmayın . yani bu iki çizgi değişecekti:

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

-1

neden sunucu koduyla karıştırılmıyor

Örneğin . php

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

</script>

-2

Express@4.16 ile MEANJS 0.6.0 kullanıyorum , iyi

Müşteri:

Denetleyici:

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

Hizmetler:

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

Sunucu

rotalar

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

kontrolör

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

-3

-------- Sorgu Dizesi Verilerine Erişme -------
Bunun http://webapplog.com/search?term=node.js&page=1 bağlantısı olduğunu varsayalım

Yani ekspres kullanabilirsiniz:

  • req.query.term
  • req.query.page veya
  • req.query(sorguyu bir Nesneye getirir)

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

-------- URL Parametrelerine Erişim -------
Bunun http://webapplog.com/node.js/pages/100 bağlantısını olduğunu varsayalım
: app.get('/:term/pages/:page',....)

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

    // Misal
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.