Possiamo ottenere le variabili nella stringa di query in Node.js proprio come le inseriamo $_GET
in PHP?
So che in Node.js possiamo ottenere l'URL nella richiesta. Esiste un metodo per ottenere i parametri della stringa di query?
Possiamo ottenere le variabili nella stringa di query in Node.js proprio come le inseriamo $_GET
in PHP?
So che in Node.js possiamo ottenere l'URL nella richiesta. Esiste un metodo per ottenere i parametri della stringa di query?
Risposte:
In Express è già fatto per te e puoi semplicemente usare req.query per questo:
var id = req.query.id; // $_GET["id"]
Altrimenti, in NodeJS, puoi accedere a req.url e al url
modulo integrato su [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) manualmente:
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
o req.param
(che è diverso da req.params
... vedi sotto.
request
e non ha nulla a che fare con Express. Vedi la risposta di @ whitequark di seguito (uso request.query
)
Dato che hai citato Express.js nei tag, ecco una risposta specifica per Express: usa req.query . Per esempio
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
req.query.id
, non è necessario utilizzare la notazione parentesi.
In Express, utilizzare req.query
.
req.params
ottiene solo i parametri di route, non i parametri della stringa di query. Vedi la documentazione di express o sails :
(req.params) Controlla i parametri del percorso, ad es .: / user /: id
(req.query) Verifica i parametri della stringa di query, ad es.? id = 12 Controlla i parametri del corpo codificati
(req.body), ex: id = 12 Per utilizzare i corpi di richiesta con urlencod, req.body dovrebbe essere un oggetto. Questo può essere fatto usando il middleware _express.bodyParser.
Detto questo, la maggior parte delle volte, si desidera ottenere il valore di un parametro indipendentemente dalla sua origine. In tal caso, utilizzare req.param('foo')
.
Il valore del parametro verrà restituito indipendentemente dal fatto che la variabile si trovasse nei parametri del percorso, nella stringa di query o nel corpo della richiesta codificato.
Nota a margine: se stai cercando di ottenere l'intersezione di tutti e tre i tipi di parametri di richiesta (simili a quelli di PHP $_REQUEST
), devi solo unire i parametri insieme: ecco come l'ho impostato in Sails . Tieni presente che l'oggetto parametri path / route ( req.params
) ha proprietà array, quindi l'ordine è importante (sebbene ciò possa cambiare in Express 4 )
req.params
nei documenti di Sails: sailsjs.org/#/documentation/reference/req/req.params.html e i nuovi documenti espressi: expressjs.com/4x/api.html#req.params
req.param()
funzione di supporto sarà probabilmente rimossa completamente in Express 5. Questo non sarà imminente fino a qualche tempo dopo nel 2017, quindi aspetterò di modificare questa risposta fino ad allora. Nel frattempo: è sicuro usare req.param()
con Express <= 3.x / Sails <= 0.12 e con l'ultima versione disponibile di Express 4, anche se con un messaggio di registro di deprecazione. (Per gli utenti di Sails: L'implementazione di Sails req.param()
verrà spostata nel core a partire da Sails v1.0 e continuerà a essere completamente supportata in Sails in futuro.)
Per Express.js vuoi fare req.params
:
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Ho imparato dalle altre risposte e ho deciso di utilizzare questo codice in tutto il mio sito:
var query = require('url').parse(req.url,true).query;
Quindi puoi semplicemente chiamare
var id = query.id;
var option = query.option;
dove dovrebbe essere l'URL per get
/path/filename?id=123&option=456
parse
sui req.url
convertiti in un oggetto.
//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"}
})
Se stai usando ES6 ed Express , prova questo destructuring
approccio:
const {id, since, fields, anotherField} = request.query;
Nel contesto:
const express = require('express');
const app = express();
app.get('/', function(req, res){
const {id, since, fields, anotherField} = req.query;
});
app.listen(3000);
Puoi usare anche i valori predefiniti con 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)
Esistono 2 modi per passare i parametri tramite il metodo GET
Metodo 1: L'approccio MVC in cui si passano i parametri come / routename /: paramname
In questo caso è possibile utilizzare req.params.paramname per ottenere il valore del parametro Ad esempio fare riferimento al codice sotto dove I Mi aspetto ID come
collegamento param potrebbe essere come: 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);
Metodo 2: Approccio generale: passaggio di variabili come stringa di query utilizzando '?' operatore
Ad esempio fare riferimento al codice sotto dove mi aspetto Id come
collegamento di un parametro di query potrebbe essere simile a: 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);
Dovresti essere in grado di fare qualcosa del genere:
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")
})
AGGIORNAMENTO 4 maggio 2014
Vecchia risposta conservata qui: https://gist.github.com/stefek99/b10ed037d2a4a323d638
1) Installa 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) Avvia l'app: node app.js
3) Visita nel browser: http://localhost:3000/endpoint?id=something
Ho ricevuto l'ID: qualcosa
(molte cose sono cambiate dalla mia risposta e credo che valga la pena tenerle aggiornate)
Un piccolo server HTTP Node.js in ascolto sulla porta 9080, analizzando i dati GET o POST e rispedendoli al client come parte della risposta è:
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);
Salvalo come parse.js
ed eseguilo sulla console immettendo "node parse.js".
Whitequark ha risposto bene. Ma con le versioni correnti di Node.js ed Express.js richiede un'altra riga. Assicurati di aggiungere "richiedi http" (seconda riga). Ho pubblicato un esempio più completo qui che mostra come può funzionare questa chiamata. Una volta eseguito, digita il http://localhost:8080/?name=abel&fruit=apple
tuo browser e otterrai una risposta interessante in base al codice.
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'));
})
È così semplice:
URL di esempio:
http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
È possibile stampare tutti i valori della stringa di query utilizzando:
console.log("All query strings: " + JSON.stringify(req.query));
Produzione
Tutte le stringhe di query: {"id": "3", "activkey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}
Per stampare specifici:
console.log("activatekey: " + req.query.activatekey);
Produzione
activkey: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK
In express.js
si può ottenere abbastanza facile, tutto quello che dovete fare nella vostra funzione di regolatore è:
app.get('/', (req, res, next) => {
const {id} = req.query;
// rest of your code here...
})
E questo è tutto, supponendo che tu stia usando la sintassi es6.
PD. {id}
sta per Object destructuring
, una nuova funzione es6.
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Puoi usarlo o provare body-parser per analizzare l'elemento speciale dai parametri di richiesta.
In realtà è semplice:
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
puoi usare il modulo url per raccogliere i parametri usando url.parse
var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;
In expressjs è fatto da,
var id = req.query.id;
Per esempio:
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
});
In Express, possiamo semplicemente usare req.query.<name>
. Funziona come quello di $_GET['name']
PHP.
Dal mio punto di vista penso che molte persone mescolino due concetti diversi. Durante lo sviluppo REST ho avuto familiarità con il passaggio delle informazioni nell'URL con due modi "variabili di percorso" e "parametri di richiesta" (parametri di query). La RFC descrive le parti dell'URI in questo modo: inserire qui la descrizione del collegamento Quindi ho capito che l'autore vorrebbe sapere come passare i parametri di richiesta. Vorrei solo semplificare la comprensione dell'argomento, ma la soluzione è stata menzionata qui molte volte.
È possibile ottenere i parametri di query dall'URI con request.query.<name of the parameter>
, la seconda soluzione menzionata era request.params.<name of the parameter>
e con questo è possibile ottenere le variabili del percorso.
Quindi, ci sono due modi in cui questo "id" può essere ricevuto: 1) usando params: il parametro params avrà un aspetto simile: supponiamo che abbiamo un array,
const courses = [{
id: 1,
name: 'Mathematics'
},
{
id: 2,
name: 'History'
}
];
Quindi per i params possiamo fare qualcosa del tipo:
app.get('/api/posts/:id',(req,res)=>{
const course = courses.find(o=>o.id == (req.params.id))
res.send(course);
});
2) Un altro metodo consiste nell'utilizzare i parametri della query. quindi l'URL sarà simile a "..... \ api \ xyz? id = 1" dove "? id = 1" è la parte della query. In questo caso possiamo fare qualcosa del tipo:
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);
Se hai bisogno di inviare GET
richiesta a un IP
così come un Domain
(Altre risposte non ha menzionato è possibile specificare una port
variabile), è possibile fare uso di questa funzione:
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);
});
}
Non perdere i moduli richiesti nella parte superiore del tuo file:
http = require("http");
url = require('url')
Inoltre, tieni presente che puoi utilizzare il https
modulo per comunicare su domini sicuri e SSL. quindi queste due righe cambieranno:
https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
Sto usando MEANJS 0.6.0 con express@4.16, va bene
Cliente:
controller:
var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)
Servizi:
this.getOrder = function (input) {return $http.get('/api/order', { params: input });};
server
itinerari
app.route('/api/order').get(products.order);
controllore
exports.order = function (req, res) {
var keyword = req.query.keyword
...
-------- Accesso ai dati della stringa di query -------
Supponiamo che questo sia il link http://webapplog.com/search?term=node.js&page=1
Quindi in Express puoi usare:
req.query.term
req.query.page
o req.query
(recupererà la query in un oggetto)
app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{
res.json({term:req.query.term, page:req.query.page})
})
-------- Accesso ai parametri URL -------
Supponiamo che questo sia il link http://webapplog.com/node.js/pages/100
Quindi in Express puoi usare:
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})
})