เราสามารถรับตัวแปรในสตริงการสืบค้นใน Node.js เหมือนกับที่เราได้รับ$_GET
ใน PHP หรือไม่?
ฉันรู้ว่าใน Node.js เราจะได้รับ URL ในคำขอ มีวิธีการรับพารามิเตอร์สตริงแบบสอบถามหรือไม่
เราสามารถรับตัวแปรในสตริงการสืบค้นใน Node.js เหมือนกับที่เราได้รับ$_GET
ใน PHP หรือไม่?
ฉันรู้ว่าใน Node.js เราจะได้รับ URL ในคำขอ มีวิธีการรับพารามิเตอร์สตริงแบบสอบถามหรือไม่
คำตอบ:
ใน Express คุณได้ทำเสร็จแล้วและคุณสามารถใช้req.queryเพื่อทำสิ่งต่อไปนี้:
var id = req.query.id; // $_GET["id"]
มิฉะนั้นใน NodeJS คุณสามารถเข้าถึงreq.urlและurl
โมดูลbuiltin ไปที่ [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) ด้วยตนเอง:
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
หรือreq.param
(ซึ่งต่างจากreq.params
... ดูด้านล่าง
request
และไม่มีอะไรเกี่ยวข้องกับ Express ดูคำตอบของ @ whitequark ด้านล่าง (ใช้request.query
)
เนื่องจากคุณได้กล่าว Express.js ในแท็กของคุณที่นี่คือคำตอบด่วนเฉพาะ: ใช้ req.query เช่น
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
req.query.id
ไม่จำเป็นต้องใช้สัญกรณ์วงเล็บ
req.query
ด่วนใช้
req.params
รับพารามิเตอร์เส้นทางเท่านั้นไม่ใช่พารามิเตอร์สตริงแบบสอบถาม ดูเอกสารด่วนหรือใบเรือ :
(req.params) ตรวจสอบ params เส้นทางเช่น: / user /: id
(req.query) ตรวจสอบพารามิเตอร์สตริงข้อความค้นหาตัวอย่าง:? id = 12 ตรวจสอบพารามิเตอร์ร่างกายแบบ urlencoded
(req.body), ex: id = 12 ในการใช้เนื้อหาคำขอ urlencoded req.body ควรเป็นวัตถุ สามารถทำได้โดยใช้มิดเดิลแวร์ _express.bodyParser
ที่กล่าวมาส่วนใหญ่คุณต้องการรับค่าพารามิเตอร์โดยไม่คำนึงถึงแหล่งที่มา req.param('foo')
ในกรณีที่ใช้
ค่าของพารามิเตอร์จะถูกส่งคืนไม่ว่าจะเป็นตัวแปรที่อยู่ในพารามิเตอร์เส้นทางสตริงการสืบค้นหรือเนื้อหาคำขอที่เข้ารหัส
Side note- ถ้าคุณกำลังเล็งที่จะได้รับจุดตัดของทั้งสามประเภทค่าคำขอ (คล้ายกับของ PHP $_REQUEST
), คุณเพียงแค่ต้องผสานพารามิเตอร์ together-- นี่เป็นวิธีที่ผมตั้งขึ้นใน Sails โปรดทราบว่าวัตถุพารามิเตอร์เส้นทาง / เส้นทาง ( req.params
) มีคุณสมบัติอาร์เรย์ดังนั้นลำดับการสั่งซื้อ (แม้ว่าอาจมีการเปลี่ยนแปลงใน Express 4 )
req.params
ในเอกสาร Sails: sailsjs.org/#/documentation/reference/req/req.reams.html และเอกสารด่วนใหม่: expressjs.com/4x/api.html#req.params
req.param()
ฟังก์ชั่นผู้ช่วยน่าจะถูกลบใน Express 5 โดยสมบูรณ์ซึ่งจะไม่ใกล้จนกว่าจะถึงเวลาต่อมาในปี 2560 ดังนั้นฉันจะรอแก้ไข คำตอบนี้จนกระทั่งแล้ว ในเวลาเฉลี่ย: มันปลอดภัยที่จะใช้req.param()
กับ Express <= 3.x / Sails <= 0.12 และด้วย Express 4 รุ่นล่าสุดที่มีให้ใช้แม้ว่าจะมีข้อความบันทึกการคัดค้าน (สำหรับผู้ใช้ Sails: การใช้งานของreq.param()
จะย้ายไปเป็นแกนหลักของ Sails v1.0 และจะยังคงได้รับการสนับสนุนอย่างเต็มที่ใน Sails ในอนาคต)
สำหรับ Express.js คุณต้องการทำreq.params
:
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
ฉันเรียนรู้จากคำตอบอื่น ๆ และตัดสินใจใช้รหัสนี้ในเว็บไซต์ของฉัน:
var query = require('url').parse(req.url,true).query;
จากนั้นคุณสามารถโทร
var id = query.id;
var option = query.option;
ควรรับ URL ที่ไหน
/path/filename?id=123&option=456
parse
บนreq.url
แปลงไปยังวัตถุ
//get query¶ms 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"}
})
หากคุณใช้ES6และExpressลองdestructuring
วิธีนี้:
const {id, since, fields, anotherField} = request.query;
ในบริบท:
const express = require('express');
const app = express();
app.get('/', function(req, res){
const {id, since, fields, anotherField} = req.query;
});
app.listen(3000);
คุณสามารถใช้ค่าเริ่มต้นด้วย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)
มี 2 วิธีในการส่งผ่านพารามิเตอร์ผ่านวิธี GET
วิธีที่ 1: วิธี MVC ที่คุณผ่านพารามิเตอร์เช่น / routename /: paramname
ในกรณีนี้คุณสามารถใช้ req.params.paramname เพื่อรับค่าพารามิเตอร์ตัวอย่างเช่นดูรหัสด้านล่างที่ฉัน ฉันคาดหวังว่า ID เป็น
ลิงก์หลักอาจเป็นเช่น: 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);
วิธีที่ 2: วิธีการทั่วไป: การส่งตัวแปรเป็นสตริงการสืบค้นโดยใช้ '?' ผู้ประกอบการ
ตัวอย่างรหัสด้านล่างที่ฉันคาดหวังว่ารหัส Id เป็น
ลิงค์พารามิเตอร์แบบสอบถามอาจเป็นเช่น: 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);
คุณควรทำสิ่งนี้:
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")
})
อัปเดต 4 พฤษภาคม 2557
คำตอบเก่าเก็บไว้ที่นี่: https://gist.github.com/stefek99/b10ed037d2a4a323d638
1) ติดตั้งด่วน: 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) เรียกใช้แอพ: node app.js
3) เยี่ยมชมในเบราว์เซอร์: http://localhost:3000/endpoint?id=something
ฉันได้รับ ID: บางอย่าง
(มีหลายสิ่งเปลี่ยนไปตั้งแต่คำตอบของฉันและฉันเชื่อว่ามันคุ้มค่าที่จะต้องรักษาสิ่งต่าง ๆ ให้ทันสมัย)
เซิร์ฟเวอร์ HTTP ขนาดเล็ก Node.js กำลังฟังพอร์ต 9080 แยกวิเคราะห์ข้อมูล GET หรือ POST และส่งกลับไปยังไคลเอนต์ซึ่งเป็นส่วนหนึ่งของการตอบสนองคือ:
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);
บันทึกเป็นparse.js
และรันบนคอนโซลโดยป้อน "node parse.js"
Whitequark ตอบสนองอย่างดี แต่ด้วยเวอร์ชันปัจจุบันของ Node.js และ Express.js ทำให้ต้องมีอีกหนึ่งบรรทัด ตรวจสอบให้แน่ใจว่าได้เพิ่ม 'ต้อง http' (บรรทัดที่สอง) ฉันโพสต์ตัวอย่างเต็มรูปแบบที่นี่เพื่อแสดงให้เห็นว่าการโทรนี้ทำงานได้อย่างไร เมื่อทำงานให้พิมพ์http://localhost:8080/?name=abel&fruit=apple
ในเบราว์เซอร์ของคุณและคุณจะได้รับการตอบสนองที่ยอดเยี่ยมตามรหัส
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'));
})
มันง่ายมาก:
URL ตัวอย่าง:
http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
คุณสามารถพิมพ์ค่าทั้งหมดของสตริงแบบสอบถามโดยใช้:
console.log("All query strings: " + JSON.stringify(req.query));
เอาท์พุต
สตริงข้อความค้นหาทั้งหมด: {"id": "3", "activkey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}
วิธีพิมพ์เฉพาะ:
console.log("activatekey: " + req.query.activatekey);
เอาท์พุต
เปิดใช้งานคีย์: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK
คุณสามารถใช้ได้
request.query.<varible-name>;
คุณสามารถใช้กับด่วน ^ 4.15.4:
var express = require('express'),
router = express.Router();
router.get('/', function (req, res, next) {
console.log(req.query);
});
หวังว่านี่จะช่วยได้
ในexpress.js
คุณจะได้รับมันสวยง่ายทั้งหมดที่คุณต้องทำในฟังก์ชั่นการควบคุมของคุณคือ:
app.get('/', (req, res, next) => {
const {id} = req.query;
// rest of your code here...
})
และนั่นคือทั้งหมดสมมติว่าคุณใช้ไวยากรณ์ es6
PD {id}
ย่อมาจากคุณสมบัติObject destructuring
ใหม่ของ es6
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
คุณสามารถใช้สิ่งนี้หรือคุณสามารถลอง body-parser สำหรับการวิเคราะห์องค์ประกอบพิเศษจากพารามิเตอร์คำขอ
มันง่ายจริง ๆ :
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
คุณสามารถใช้โมดูล url เพื่อรวบรวมพารามิเตอร์โดยใช้ url.parse
var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;
ใน expressjs มันทำโดย
var id = req.query.id;
เช่น:
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
});
req.query.<name>
ด่วนเราก็สามารถใช้ มันทำงานได้เหมือนกับ$_GET['name']
ใน PHP
จากมุมมองของฉันฉันคิดว่าหลายคนผสมผสานสองแนวคิดที่แตกต่างกัน ในระหว่างการพัฒนาส่วนที่เหลือฉันคุ้นเคยกับการส่งผ่านข้อมูลใน URL ด้วยสองวิธี "ตัวแปรเส้นทาง" และ "พารามิเตอร์คำขอ" (พารามิเตอร์แบบสอบถาม) RFC อธิบายส่วนต่างๆของ URI ดังนี้: ป้อนคำอธิบายลิงก์ที่นี่ดังนั้นฉันเข้าใจว่าผู้เขียนต้องการทราบวิธีการส่งพารามิเตอร์คำขอ ฉันเพียงต้องการทำให้หัวข้อเข้าใจง่ายขึ้น แต่มีการกล่าวถึงวิธีแก้ปัญหาที่นี่หลายครั้ง
คุณสามารถรับพารามิเตอร์เคียวรีจาก URI ด้วยrequest.query.<name of the parameter>
วิธีแก้ปัญหาที่สองที่กล่าวถึงคือrequest.params.<name of the parameter>
สิ่งนี้คุณสามารถรับตัวแปรพา ธ
ดังนั้นมีสองวิธีที่สามารถรับ "id" นี้: 1) ใช้ params: โค้ด params จะมีหน้าตาดังนี้: สมมติว่าเรามีอาร์เรย์
const courses = [{
id: 1,
name: 'Mathematics'
},
{
id: 2,
name: 'History'
}
];
จากนั้นสำหรับ params เราสามารถทำสิ่งที่ชอบ:
app.get('/api/posts/:id',(req,res)=>{
const course = courses.find(o=>o.id == (req.params.id))
res.send(course);
});
2) วิธีอื่นคือการใช้พารามิเตอร์ข้อความค้นหา ดังนั้น URL จะดูเหมือน "..... \ api \ xyz? id = 1" โดยที่ "? id = 1" เป็นส่วนของแบบสอบถาม ในกรณีนี้เราสามารถทำสิ่งที่ชอบ:
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);
หากคุณต้องการส่งGET
คำขอไปยังIP
a Domain
( a คำตอบอื่น ๆ ไม่ได้กล่าวถึงคุณสามารถระบุport
ตัวแปร) คุณสามารถใช้ฟังก์ชันนี้ได้:
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);
});
}
อย่าพลาดโมดูลที่ต้องการที่ด้านบนของไฟล์ของคุณ:
http = require("http");
url = require('url')
https
อย่าลืมว่าคุณอาจใช้โมดูลสำหรับการสื่อสารผ่านโดเมนและ SSL ที่ปลอดภัย ดังนั้นทั้งสองบรรทัดจะเปลี่ยน:
https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
ทำไมไม่ผสมกับรหัสเซิร์ฟเวอร์
เช่น . PHP
<script>
var ip=<?php echo($_SERVER['REMOTE_ADDR']);?>
</script>
ฉันใช้MEANJS 0.6.0กับ express@4.16 ก็ดี
ลูกค้า:
ควบคุม:
var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)
บริการ:
this.getOrder = function (input) {return $http.get('/api/order', { params: input });};
เซิร์ฟเวอร์
เส้นทาง
app.route('/api/order').get(products.order);
ตัวควบคุม
exports.order = function (req, res) {
var keyword = req.query.keyword
...
-------- การเข้าถึงข้อมูลสตริงการสืบค้น -------
สมมติว่านี่คือลิงค์http://webapplog.com/search?term=node.js&page=1
ดังนั้นในด่วนคุณสามารถใช้:
req.query.term
req.query.page
หรือ req.query
(มันจะดึงแบบสอบถามในวัตถุ)
app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{
res.json({term:req.query.term, page:req.query.page})
})
-------- การเข้าถึงพารามิเตอร์ URL -------
สมมติว่านี่คือลิงค์http://webapplog.com/node.js/pages/100
ดังนั้นโดยชัดแจ้งคุณสามารถใช้:
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})
})