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 $_GET
trong 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?
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 $_GET
trong 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?
Câu trả lời:
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.url và url
mô-đ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;
url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
req.query
req.query
hoặc req.param
(khác với req.params
... xem bên dưới.
request
và 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
)
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);
req.query.id
, không cần sử dụng ký hiệu ngoặc.
Trong Express, sử dụng req.query
.
req.params
chỉ 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.params
trong 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
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à 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.)
Đố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);
});
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
parse
trên req.url
người cải đạo cho một đối tượng.
Nếu bạn đang sử dụng ES6 và Express , hãy thử destructuring
phươ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)
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);
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")
})
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ứ)
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.js
và chạy nó trên bàn điều khiển bằng cách nhập "nút parse.js".
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=apple
trì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'));
})
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
Trong express.js
bạ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 destructuring
một tính năng es6 mới.
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.
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
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
});
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.
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.
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);
});
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
Nếu bạn cần gửi GET
yêu cầu đến IP
một Domain
(Các câu trả lời khác không đề cập đến bạn có thể chỉ định một port
biế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 https
mô-đ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) => { ......
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
...
-------- 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)
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
app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{
res.json({term:req.params.term, page:req.params.page})
})