Bisakah kita mendapatkan variabel dalam string kueri di Node.js sama seperti kita mendapatkannya $_GET
di PHP?
Saya tahu bahwa di Node.js kita bisa mendapatkan URL dalam permintaan. Apakah ada metode untuk mendapatkan parameter string kueri?
Bisakah kita mendapatkan variabel dalam string kueri di Node.js sama seperti kita mendapatkannya $_GET
di PHP?
Saya tahu bahwa di Node.js kita bisa mendapatkan URL dalam permintaan. Apakah ada metode untuk mendapatkan parameter string kueri?
Jawaban:
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 url
modul 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;
url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
req.query
req.query
atau req.param
(yang berbeda dari req.params
... lihat di bawah.
request
dan tidak ada hubungannya dengan Express. Lihat @ whitequark jawaban di bawah ini (gunakan request.query
)
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);
req.query.id
, tidak perlu menggunakan notasi braket.
Di Express, gunakan req.query
.
req.params
hanya 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 )
req.params
dalam dokumen Sails: sailsjs.org/#/documentation/reference/req/req.params.html dan dokumen ekspres baru: expressjs.com/4x/api.html#req.params
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.)
Untuk Express.js yang ingin Anda lakukan req.params
:
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
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
parse
pada req.url
mualaf ke objek.
Jika Anda menggunakan ES6 dan Express , coba destructuring
pendekatan 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 destructuring
juga:
// 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)
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);
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")
})
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)
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".
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=apple
browser 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'));
})
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
Dalam express.js
Anda 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.
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.
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
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
});
Dalam Express, kita cukup menggunakan req.query.<name>
. Ini berfungsi sama seperti $_GET['name']
di PHP.
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.
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);
});
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
Jika Anda perlu mengirim GET
permintaan ke IP
dan juga Domain
(Jawaban lain tidak menyebutkan Anda dapat menentukan port
variabel), 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 https
modul untuk berkomunikasi melalui domain dan ssl yang aman. jadi dua baris ini akan berubah:
https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
Saya menggunakan MEANJS 0.6.0 dengan express@4.16, 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
...
-------- 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)
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
app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{
res.json({term:req.params.term, page:req.params.page})
})