Bagaimana cara mendapatkan variabel GET (string query) di Express.js di Node.js?

1193

Bisakah kita mendapatkan variabel dalam string kueri di Node.js sama seperti kita mendapatkannya $_GETdi PHP?

Saya tahu bahwa di Node.js kita bisa mendapatkan URL dalam permintaan. Apakah ada metode untuk mendapatkan parameter string kueri?

XMen
sumber
6
Jawaban @ whitequark (yang memiliki suara terbanyak) harus ditandai sebagai jawaban yang benar. Apakah Anda keberatan memperbaruinya untuk orang lain dengan pertanyaan yang sama seperti Anda yang menemukan pertanyaan Anda?
Dev01
Gunakan objek permintaan dalam permintaan ekspres - di sini adalah contoh menggunakan permintaan permintaan express
drorw
@ Dev01 dia tidak aktif sejak 2014 lol
John Balvin Arias
Jika ada yang mencari Nodejs API boilerplate dengan Expressjs dan MongoDB. Coba ini: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Jawaban:

1183

Dalam Express sudah dilakukan untuk Anda dan Anda dapat menggunakan req.query untuk itu:

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

Kalau tidak, di NodeJS, Anda dapat mengakses req.url dan urlmodul builtin ke [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) secara manual:

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
Marcus Granström
sumber
24
Perhatian di sini: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz
Apa fungsi tambahan / lebih baik yang disediakan hapi (jika ada)?
BaltoStar
180
Ini diterima tetapi itu bukan jawaban yang disukai. Lihat di bawah! gunakanreq.query
Cheeso
2
Jawaban mikemcneil di bawah adalah pilihan yang lebih baik. Gunakan req.queryatau req.param(yang berbeda dari req.params... lihat di bawah.
MindJuice
9
-1 . Kode di atas adalah bobot mati - sesuatu yang akan diperbaiki oleh pengembang yang baik di tempat. Ini adalah jawaban untuk " Bagaimana cara mendapatkan string kueri dari URL? " - URL yang dimaksud kebetulan berada di objek bernama requestdan tidak ada hubungannya dengan Express. Lihat @ whitequark jawaban di bawah ini (gunakan request.query)
lunohodov
1649

Karena Anda telah menyebutkan Express.js dalam tag Anda, berikut ini adalah jawaban khusus-Ekspres: gunakan req.query . Misalnya

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

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

app.listen(3000);
whitequark
sumber
68
Layak disebutkan bahwa Anda harus menggunakan req.query.id, tidak perlu menggunakan notasi braket.
alex
Untuk menginstal express, lakukan: yes | sudo npm install -g express --- Saya mencoba mengedit tetapi Alexis King telah dikembalikan.
Felipe
dalam pertanyaan dia sedang mencari cara untuk mendapatkan semua parameter string kueri seperti array. Jawaban yang benar adalah ini: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato
463

Di Express, gunakan req.query.

req.paramshanya mendapatkan parameter rute, bukan parameter string kueri. Lihat dokumentasi ekspres atau layar :

(req.params) Memeriksa params rute, mis: / user /: id

(req.query) Memeriksa params string kueri, mis:? id = 12 Memeriksa paramsel urlencode

(req.body), ex: id = 12 Untuk memanfaatkan badan permintaan yang di-urlencode, req.body harus menjadi objek. Ini dapat dilakukan dengan menggunakan middleware _express.bodyParser.

Yang mengatakan, sebagian besar waktu, Anda ingin mendapatkan nilai parameter terlepas dari sumbernya. Dalam hal itu, gunakan req.param('foo').

Nilai parameter akan dikembalikan apakah variabel berada di parameter rute, string kueri, atau badan permintaan yang disandikan.

Catatan samping - jika Anda ingin mendapatkan persimpangan dari ketiga jenis parameter permintaan (mirip dengan PHP $_REQUEST), Anda hanya perlu menggabungkan parameter bersama - inilah cara saya mengaturnya di Sails . Perlu diingat bahwa parameter path / route object ( req.params) memiliki properti array, jadi ketertiban penting (meskipun ini dapat berubah pada Express 4 )

mikermcneil
sumber
req.param ('STRING') adalah jawaban yang benar. Lihat di sini: stackoverflow.com/questions/17007997/… (gulir ke bawah untuk menjawab di bawah jawaban yang diterima)
Joseph Juhnke
3
@deltab di sini adalah tautan ke req.paramsdalam dokumen Sails: sailsjs.org/#/documentation/reference/req/req.params.html dan dokumen ekspres baru: expressjs.com/4x/api.html#req.params
mikermcneil
7
req.param tidak digunakan lagi dalam express 4.x, harus menggunakan req.params, req.body atau req.query sebagai gantinya: expressjs.com/en/4x/api.html#req.param
swang
@swang benar- Saya mengecek dengan Doug Wilson baru-baru ini tentang ini, dan req.param()fungsi pembantu kemungkinan akan sepenuhnya dihapus di Express 5. Ini tidak akan segera sampai beberapa waktu kemudian pada 2017, jadi saya akan menunggu untuk mengedit jawaban ini sampai saat itu. Sementara itu: Aman untuk digunakan req.param()dengan Express <= 3.x / Sails <= 0.12, dan dengan rilis terbaru Express 4 yang tersedia, meskipun dengan pesan log penghentian. (Untuk pengguna Sails: Implementasi req.param()akan pindah ke inti pada Sails v1.0, dan itu akan terus didukung penuh di Sails di masa depan.)
mikermcneil
142

Untuk Express.js yang ingin Anda lakukan req.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});
Cris-O
sumber
8
untuk mengambil variabel GET di express.js Anda bisa menggunakan req.query.
Ben Sinclair
6
@Andy req.params lebih baik karena: req.param (nama [, default]) akan: Mengembalikan nilai nama param saat ada atau default. Memeriksa params rute (req.params), ex: / user /: id Memeriksa params string kueri (req.query), mis:? Id = 12 Memeriksa parem urlencoded body (req.body), ex: id = 12 Untuk memanfaatkan permintaan urlencoded tubuh, req.body harus menjadi objek. Ini dapat dilakukan dengan menggunakan middleware _express.bodyParser.
Cris-O
Saya tidak tahu req.param memeriksa req.query, terima kasih untuk catatan ini.
Ben Sinclair
3
req.param ('parameterName') akan memeriksa req.body, req.query, dan req.params, tetapi jika Anda ingin semua parameter kueri sebagai objek, Anda harus menggunakan req.query.
mikermcneil
1
@mikermcneil Anda mungkin mencampur req.param () dan req.params (objek). Menurut expressjs docs req.param () mencari nilai dalam ketiga objek. expressjs.com/api.html#req.param
Ben Sinclair
78

Saya belajar dari jawaban lain dan memutuskan untuk menggunakan kode ini di seluruh situs saya:

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

Maka Anda bisa menelepon

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

di mana URL untuk mendapatkan seharusnya

/path/filename?id=123&option=456
Grant Li
sumber
2
tidakkah id dan opsi tidak ditentukan karena kueri hanya berupa string? kita harus menguraikan dua parameter terpisah dengan regex atau sejenisnya.
ossek
1
@ossek Saya percaya tindakan yang menyebabkan parsepada req.urlmualaf ke objek.
whitfin
1
@ossek, dia benar sebagai argumen kedua untuk url.parse, yang membuat properti query menunjuk ke sebuah objek (dan yang secara internal menggunakan modul querystring) Anda dapat menemukan lebih banyak tentang hal itu di dokumen [di sini] ( nodejs.org/docs / latest / api / ... )
Bharat
Bekerja .... banyak terima kasih !!!
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"}

})
bos besar
sumber
48

Jika Anda menggunakan ES6 dan Express , coba destructuringpendekatan ini :

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

Dalam konteks:

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

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

app.listen(3000);

Anda dapat menggunakan nilai default destructuringjuga:

// 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
sumber
Menggunakan perusakan objek dengan nilai default! +1
Pengembang Utama
43

Ada 2 cara untuk meneruskan parameter melalui metode GET

Metode 1: Pendekatan MVC tempat Anda melewatkan parameter seperti / routename /: paramname
Dalam hal ini Anda dapat menggunakan req.params.paramname untuk mendapatkan nilai parameter Sebagai contoh, lihat kode di bawah ini di mana saya Saya mengharapkan Id sebagai
tautan param bisa seperti: 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);

Metode 2: Pendekatan Umum: Melewati variabel sebagai string kueri menggunakan '?'
Contoh operator, lihat kode di bawah ini di mana saya mengharapkan Id sebagai
tautan parameter kueri bisa seperti: 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
sumber
40

Anda harus dapat melakukan sesuatu seperti ini:

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
sumber
26

UPDATE 4 Mei 2014

Jawaban lama dipertahankan di sini: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Instal 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) Jalankan aplikasi: node app.js

3) Kunjungi di browser: http://localhost:3000/endpoint?id=something

Saya telah menerima ID: sesuatu


(banyak hal telah berubah sejak jawaban saya dan saya percaya ada baiknya memperbarui hal-hal ini)

Mars Robertson
sumber
20

Server HTTP Node.js kecil yang mendengarkan pada port 9080, mem-parsing data GET atau POST dan mengirimkannya kembali ke klien sebagai bagian dari respons adalah:

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

Simpan sebagai parse.js, dan jalankan di konsol dengan memasukkan "node parse.js".

adriano72
sumber
3
Anda tidak perlu meminta sys dalam contoh ini
danwellman
20

Whitequark merespons dengan baik. Tetapi dengan versi Node.js dan Express.js saat ini, ia membutuhkan satu baris lagi. Pastikan untuk menambahkan 'memerlukan http' (baris kedua). Saya telah memposting contoh yang lebih lengkap di sini yang menunjukkan bagaimana panggilan ini dapat bekerja. Setelah berjalan, ketikkan http://localhost:8080/?name=abel&fruit=applebrowser Anda, dan Anda akan mendapatkan respons keren berdasarkan kode.

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
sumber
15

Sangat sederhana:

URL contoh:

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

Anda bisa mencetak semua nilai string kueri dengan menggunakan:

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

Keluaran

Semua string kueri: {"id": "3", "activatekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Untuk mencetak spesifik:

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

Keluaran

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

Saran Pal
sumber
13

Kamu bisa menggunakan

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

Anda dapat menggunakan dengan express ^ 4.15.4:

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

Semoga ini membantu.

ajafik
sumber
6

Dalam express.jsAnda bisa mendapatkannya cukup mudah, semua yang perlu Anda lakukan dalam fungsi controller Anda adalah:

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

Dan itu saja, dengan anggapan Anda menggunakan sintaksis ES6.

PD {id}singkatan Object destructuring, fitur es6 baru.

Kevin Alemán
sumber
Saya menggunakan express dengan simpul jadi ini bekerja dengan baik untuk saya. Terima kasih!
user752746
4
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

Anda dapat menggunakan ini atau Anda dapat mencoba body-parser untuk mem-parsing elemen khusus dari parameter permintaan.

Mehedi Abdullah
sumber
1
Bisakah Anda menjelaskan lebih lanjut bagaimana ini menjawab pertanyaan?
Nico Haase
Dan bagaimana cara mem-parsing daftar parameter yang ada?
Nico Haase
Anda dapat menggunakan modul body-parser dari node.js
Mehedi Abdullah
1

Ini sebenarnya sederhana:

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
sumber
0

Anda dapat menggunakan modul url untuk mengumpulkan parameter dengan menggunakan url.parse

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

Di expressjs itu dilakukan oleh,

var id = req.query.id;

Misalnya:

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
});
Pembuat kode
sumber
0

Dalam Express, kita cukup menggunakan req.query.<name>. Ini berfungsi sama seperti $_GET['name']di PHP.

Ankit Singh
sumber
0

Dari sudut pandang saya, saya pikir banyak orang menggabungkan dua konsep yang berbeda. Selama pengembangan REST, saya terbiasa menyampaikan informasi di URL dengan dua cara "variabel path" dan "parameter permintaan" (parameter kueri). RFC menggambarkan bagian-bagian URI seperti ini: masukkan uraian tautan di sini. Jadi saya mengerti bahwa penulis ingin mengetahui cara menyampaikan parameter permintaan. Saya hanya ingin membuat topik lebih mudah dimengerti, tetapi solusinya disebutkan di sini berkali-kali.

Anda bisa mendapatkan parameter kueri dari URI dengan request.query.<name of the parameter>, solusi yang disebutkan kedua adalah request.params.<name of the parameter>dan dengan ini Anda bisa mendapatkan variabel path.

Peter S.
sumber
0

Jadi, ada dua cara di mana "id" ini dapat diterima: 1) menggunakan params: kode params akan terlihat seperti: Katakanlah kita memiliki array,

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

Kemudian untuk params kita dapat melakukan sesuatu seperti:

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

2) Metode lain adalah dengan menggunakan parameter kueri. jadi url akan terlihat seperti "..... \ api \ xyz? id = 1" di mana "? id = 1" adalah bagian permintaan. Dalam hal ini kita dapat melakukan sesuatu seperti:

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

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

app.listen(3000);
Sarthak Dalabehera
sumber
0

Jika Anda perlu mengirim GETpermintaan ke IPdan juga Domain(Jawaban lain tidak menyebutkan Anda dapat menentukan portvariabel), Anda dapat menggunakan fungsi ini:

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

Jangan lewatkan membutuhkan modul di bagian atas file Anda:

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

Juga perhatikan bahwa Anda dapat menggunakan httpsmodul untuk berkomunikasi melalui domain dan ssl yang aman. jadi dua baris ini akan berubah:

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

mengapa tidak dicampur dengan kode server

mis. php

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

</script>
chings228
sumber
-2

Saya menggunakan MEANJS 0.6.0 dengan [email protected], bagus

Klien:

Pengendali:

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

jasa:

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

Server

rute

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

pengontrol

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

-------- Mengakses Data Query String -------
Misalkan ini adalah tautan http://webapplog.com/search?term=node.js&page=1

Jadi secara kilat Anda dapat menggunakan:

  • req.query.term
  • req.query.page atau
  • req.query(itu akan mengambil kueri di Objek)

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

-------- Mengakses Parameter URL -------
Misalkan ini adalah tautan http://webapplog.com/node.js/pages/100
Jadi secara tegas Anda dapat menggunakan: app.get('/:term/pages/:page',....)

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

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