Làm cách nào để có được các biến GET (chuỗi truy vấn) trong Express.js trên Node.js?


1193

Chúng ta có thể lấy các biến trong chuỗi truy vấn trong Node.js giống như chúng ta lấy chúng $_GETtrong PHP không?

Tôi biết rằng trong Node.js, chúng tôi có thể nhận được URL trong yêu cầu. Có một phương pháp để có được các tham số chuỗi truy vấn?


6
Câu trả lời của @ Whitequark (câu trả lời nhiều nhất) nên được đánh dấu là câu trả lời đúng. Bạn có phiền cập nhật nó cho những người khác có cùng câu hỏi với bạn mà vấp phải câu hỏi của bạn không?
Dev01

Sử dụng đối tượng truy vấn trong yêu cầu cấp tốc - đây là các ví dụ sử dụng truy vấn yêu cầu cấp tốc
drorw

@ Dev01 anh ấy không hoạt động kể từ năm 2014 lol
John Balvin Arias

Nếu bất cứ ai đang tìm kiếm bản tóm tắt API Nodejs với Expressjs và MongoDB. Hãy thử điều này: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Câu trả lời:


1183

Trong Express, nó đã được thực hiện cho bạn và bạn chỉ cần sử dụng req.query cho điều đó:

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

Mặt khác, trong NodeJS, bạn có thể truy cập req.urlurlmô-đun dựng sẵn để [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlopes_parftereryopes_slashesdenotehost ) theo cách thủ công:

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

24
chú ý ở đây: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

Hapi cung cấp chức năng bổ sung / tốt hơn nào (nếu có)?
BaltoStar

180
Điều này được chấp nhận nhưng nó không phải là câu trả lời ưa thích. Xem bên dưới! sử dụngreq.query
Cheeso

2
Câu trả lời của mikemcneil dưới đây là một lựa chọn tốt hơn. Sử dụng req.queryhoặc req.param(khác với req.params... xem bên dưới.
MindJuice

9
-1 . Mã ở trên là một trọng số - một cái gì đó một nhà phát triển tốt sẽ tái cấu trúc tại chỗ. Đây là câu trả lời cho " Cách nhận chuỗi truy vấn của URL? " - URL được đề cập chỉ nằm trong một đối tượng có tên requestvà không liên quan gì đến Express. Xem câu trả lời của @ whitequark bên dưới (sử dụng request.query)
lunohodov

1649

Vì bạn đã đề cập Express.js trong thẻ của mình, đây là câu trả lời dành riêng cho Express: sử dụng req.query . Ví dụ

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

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

app.listen(3000);

68
Đáng nói là bạn nên sử dụng req.query.id, không cần sử dụng ký hiệu ngoặc.
alex

Để cài đặt express làm điều đó: có | sudo npm install -g express --- Tôi đã cố chỉnh sửa nhưng Alexis King đã được hoàn nguyên.
Felipe

trong câu hỏi, ông đang tìm cách để có được tất cả các tham số chuỗi truy vấn như một mảng. Câu trả lời đúng là đây: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato

463

Trong Express, sử dụng req.query.

req.paramschỉ nhận được các tham số tuyến đường, không phải các tham số chuỗi truy vấn. Xem tài liệu chuyển phát nhanh hoặc buồm :

(req.params) Kiểm tra thông số tuyến đường, ví dụ: / user /: id

(req.query) Kiểm tra tham số chuỗi truy vấn, ví dụ :? id = 12 Kiểm tra thông số cơ thể urlencoding

(req.body), ví dụ: id = 12 Để sử dụng các nhóm yêu cầu được mã hóa url, req.body phải là một đối tượng. Điều này có thể được thực hiện bằng cách sử dụng phần mềm trung gian _express.bodyParser.

Điều đó nói rằng, hầu hết thời gian, bạn muốn nhận được giá trị của một tham số bất kể nguồn của nó. Trong trường hợp đó, sử dụng req.param('foo').

Giá trị của tham số sẽ được trả về cho dù biến nằm trong tham số tuyến, chuỗi truy vấn hoặc thân yêu cầu được mã hóa.

Lưu ý bên lề - nếu bạn đang nhắm đến việc có giao điểm của cả ba loại tham số yêu cầu (tương tự như PHP $_REQUEST), bạn chỉ cần hợp nhất các tham số lại với nhau-- đây là cách tôi thiết lập nó trong Sails . Hãy nhớ rằng đối tượng tham số đường dẫn / tuyến đường ( req.params) có các thuộc tính mảng, vì vậy thứ tự là vấn đề (mặc dù điều này có thể thay đổi trong Express 4 )


req.param ('CHUINGI') là câu trả lời đúng. Xem tại đây: stackoverflow.com/questions/17007997/ Khắc (cuộn xuống để trả lời bên dưới câu trả lời được chấp nhận)
Joseph Juhnke

3
@deltab đây là một liên kết đến req.paramstrong các tài liệu Sails: sailsjs.org/#/documentation/reference/req/req.params.html và các tài liệu thể hiện mới: expressjs.com/4x/api.html#req.params
mikermcneil

7
req.param không được dùng trong express 4.x, nên sử dụng req.params, req.body hoặc req.query thay thế: expressjs.com/en/4x/api.html#req.param
swang

@swang đã đúng- Tôi đã kiểm tra kỹ lưỡng với Doug Wilson gần đây về vấn đề này và req.param()chức năng của trình trợ giúp có thể sẽ bị xóa hoàn toàn trong Express 5. Điều này sẽ không xảy ra cho đến một thời gian sau vào năm 2017, vì vậy tôi sẽ chờ để chỉnh sửa Câu trả lời này cho đến khi đó. Trong thời gian trung bình: An toàn khi sử dụng req.param()với Express <= 3.x / Sails <= 0.12 với bản phát hành có sẵn mới nhất của Express 4, mặc dù có thông báo nhật ký không dùng nữa. (Đối với người dùng Sails: Việc triển khai req.param()sẽ chuyển sang cốt lõi kể từ Sails v1.0 và nó sẽ tiếp tục được hỗ trợ đầy đủ trong Sails trong tương lai.)
mikermcneil

142

Đối với Express.js bạn muốn làm req.params:

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

8
để truy xuất các biến GET trong express.js, bạn có thể sử dụng req.query.
Ben Sinclair

6
@Andy req.params tốt hơn vì: req.param (name [, default]) sẽ: Trả về giá trị của tên param khi có mặt hoặc mặc định. Kiểm tra các tham số tuyến đường (req.params), ví dụ: / user /: id Kiểm tra các tham số chuỗi truy vấn (req.query), ví dụ: id cơ thể, req.body nên là một đối tượng. Điều này có thể được thực hiện bằng cách sử dụng phần mềm trung gian _express.bodyParser.
Cris-O

Tôi không biết kiểm tra req.param cho req.query, cảm ơn vì lưu ý này.
Ben Sinclair

3
req.param ('tham sốName') sẽ kiểm tra req.body, req.query và req.params, nhưng nếu bạn muốn tất cả các tham số truy vấn làm đối tượng, bạn nên sử dụng req.query.
mikermcneil

1
@mikermcneil có lẽ bạn đã trộn lẫn req.param () và req.params (object). Theo tài liệu expressjs req.param () tìm kiếm giá trị trong cả ba đối tượng.expressjs.com/api.html#req.param
Ben Sinclair

78

Tôi đã học được từ các câu trả lời khác và quyết định sử dụng mã này trên toàn bộ trang web của mình:

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

Sau đó, bạn chỉ có thể gọi

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

URL nên lấy ở đâu

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

2
Sẽ không xác định id và tùy chọn vì truy vấn chỉ là một chuỗi? chúng ta phải phân tích hai tham số riêng biệt bằng biểu thức chính quy hoặc tương tự.
ossek

1
@ossek tôi tin rằng các hành vi gây parsetrên req.urlngười cải đạo cho một đối tượng.
whitfin

1
@ossek, anh ấy đã cung cấp đúng như một đối số thứ hai cho url.parse, điều này làm cho thuộc tính truy vấn trỏ đến một đối tượng (và bên trong sử dụng mô-đun chuỗi truy vấn), bạn có thể tìm hiểu thêm về nó trong tài liệu [tại đây] ( nodejs.org/docs / mới nhất / api / Thẻ )
Bharat

Đã làm việc .... cảm ơn rất nhiều !!!
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

Nếu bạn đang sử dụng ES6Express , hãy thử destructuringphương pháp này :

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

Trong ngữ cảnh:

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

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

app.listen(3000);

Bạn cũng có thể sử dụng các giá trị mặc định 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)


Sử dụng phá hủy đối tượng với các giá trị mặc định! +1
Nhà phát triển chính

43

Có 2 cách để truyền tham số thông qua phương thức GET

Cách 1: Cách tiếp cận MVC nơi bạn truyền các tham số như / Routename /: paramname
Trong trường hợp này, bạn có thể sử dụng req.params.paramname để lấy giá trị tham số Ví dụ tham khảo bên dưới mã trong đó tôi Tôi đang mong đợi Id là một
liên kết param có thể giống như: 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);

Phương pháp 2: Cách tiếp cận chung: Truyền các biến dưới dạng chuỗi truy vấn bằng cách sử dụng '?' Toán tử
Ví dụ tham khảo mã bên dưới nơi tôi đang mong đợi Id dưới dạng
liên kết tham số truy vấn có thể giống như: 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

Bạn sẽ có thể làm một cái gì đó như thế này:

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

CẬP NHẬT ngày 4 tháng 5 năm 2014

Câu trả lời cũ được bảo tồn tại đây: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Cài đặt nhanh: 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) Chạy ứng dụng: node app.js

3) Truy cập trong trình duyệt: http://localhost:3000/endpoint?id=something

Tôi đã nhận được ID: một cái gì đó


(nhiều điều đã thay đổi kể từ câu trả lời của tôi và tôi tin rằng nó đáng để cập nhật mọi thứ)


20

Một máy chủ HTTP Node.js nhỏ nghe trên cổng 9080, phân tích dữ liệu GET hoặc POST và gửi lại cho máy khách như một phần của phản hồi là:

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

Lưu nó dưới dạng parse.jsvà chạy nó trên bàn điều khiển bằng cách nhập "nút parse.js".


3
bạn không cần phải yêu cầu hệ thống trong ví dụ này
danwellman

20

Whitequark trả lời độc đáo. Nhưng với các phiên bản hiện tại của Node.js và Express.js, nó yêu cầu thêm một dòng. Đảm bảo thêm 'yêu cầu http' (dòng thứ hai). Tôi đã đăng một ví dụ đầy đủ hơn ở đây cho thấy cách cuộc gọi này có thể hoạt động. Sau khi chạy, nhập http://localhost:8080/?name=abel&fruit=appletrình duyệt của bạn và bạn sẽ nhận được phản hồi tuyệt vời dựa trên mã.

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

Nó rất đơn giản:

URL ví dụ:

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

Bạn có thể in tất cả các giá trị của chuỗi truy vấn bằng cách sử dụng:

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

Đầu ra

Tất cả các chuỗi truy vấn: {"id": "3", "activkey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVVV"

Để in cụ thể:

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

Đầu ra

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



13

Bạn có thể sử dụng với express ^ 4.15.4:

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

Hi vọng điêu nay co ich.


6

Trong express.jsbạn có thể làm cho nó khá dễ dàng, tất cả những gì bạn cần làm trong chức năng điều khiển của mình là:

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

Và đó là tất cả, giả sử bạn đang sử dụng cú pháp es6.

PD. {id}là viết tắt của Object destructuringmột tính năng es6 mới.


Tôi đang sử dụng express với nút nên điều này hoạt động hoàn hảo với tôi. Cảm ơn bạn!
dùng752746

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

Bạn có thể sử dụng cái này hoặc bạn có thể thử trình phân tích cú pháp cơ thể để phân tích cú pháp phần tử đặc biệt từ các tham số yêu cầu.


1
Bạn có thể giải thích thêm làm thế nào điều này trả lời câu hỏi?
Nico Haase

Và làm thế nào để phân tích một danh sách tham số hiện có?
Nico Haase

bạn có thể sử dụng mô-đun trình phân tích cú pháp cơ thể từ node.js
Mehedi Abdullah

1

Nó thực sự đơn giản:

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

bạn có thể sử dụng mô-đun url để thu thập các tham số bằng cách sử dụng url.parse

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

Trong expressjs nó được thực hiện bởi,

var id = req.query.id;

Ví dụ:

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

Trong Express, chúng ta chỉ cần sử dụng req.query.<name>. Nó hoạt động tương tự như $_GET['name']trong PHP.


0

Từ quan điểm của tôi, tôi nghĩ rằng nhiều người trộn lẫn hai khái niệm khác nhau. Trong quá trình phát triển REST, tôi đã quen với việc truyền thông tin trong URL bằng hai cách "biến đường dẫn" và "tham số yêu cầu" (tham số truy vấn). RFC mô tả các phần của URI như thế này: nhập mô tả liên kết vào đây Vì vậy tôi hiểu rằng tác giả muốn biết cách truyền tham số yêu cầu. Tôi chỉ muốn làm cho chủ đề dễ hiểu hơn, nhưng giải pháp đã được đề cập ở đây nhiều lần.

Bạn có thể nhận được các tham số truy vấn từ URI với request.query.<name of the parameter>, giải pháp được đề cập thứ hai là request.params.<name of the parameter>và với điều này, bạn có thể nhận được các biến đường dẫn.


0

Vì vậy, có hai cách mà "id" này có thể được nhận: 1) bằng cách sử dụng params: params code sẽ trông giống như: Giả sử chúng ta có một mảng,

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

Sau đó, đối với params chúng ta có thể làm một cái gì đó như:

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

2) Một phương pháp khác là sử dụng các tham số truy vấn. vì vậy url sẽ trông giống như "..... \ api \ xyz? id = 1" trong đó "? id = 1" là phần truy vấn. Trong trường hợp này, chúng ta có thể làm một cái gì đó như:

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

Nếu bạn cần gửi GETyêu cầu đến IPmột Domain(Các câu trả lời khác không đề cập đến bạn có thể chỉ định một portbiến), bạn có thể sử dụng chức năng này:

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

Đừng bỏ lỡ các mô-đun yêu cầu ở đầu tệp của bạn:

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

Cũng lưu ý rằng bạn có thể sử dụng httpsmô-đun để liên lạc qua các miền và ssl được bảo mật. vì vậy hai dòng này sẽ thay đổi:

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

-1

Tại sao không trộn lẫn với mã máy chủ

ví dụ . php

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

</script>

-2

Tôi đang sử dụng MEANJS 0.6.0 với express@4.16, thật tốt

Khách hàng:

Điều khiển:

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

dịch vụ:

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

Người phục vụ

tuyến đường

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

bộ điều khiển

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

-3

-------- Truy cập dữ liệu chuỗi truy vấn -------
Giả sử đây là liên kết http://webapplog.com/search?term=node.js&page=1

Vì vậy, trong express bạn có thể sử dụng:

  • req.query.term
  • req.query.page hoặc là
  • req.query(nó sẽ tìm nạp truy vấn trong Object)

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

-------- Truy cập các tham số URL -------
Giả sử đây là liên kết http://webapplog.com/node.js/pages/100
Vì vậy, trong phần thể hiện bạn có thể sử dụng: app.get('/:term/pages/:page',....)

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

    // Thí dụ
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.