¿Podemos obtener las variables en la cadena de consulta en Node.js tal como las tenemos $_GET
en PHP?
Sé que en Node.js podemos obtener la URL en la solicitud. ¿Hay algún método para obtener los parámetros de la cadena de consulta?
¿Podemos obtener las variables en la cadena de consulta en Node.js tal como las tenemos $_GET
en PHP?
Sé que en Node.js podemos obtener la URL en la solicitud. ¿Hay algún método para obtener los parámetros de la cadena de consulta?
Respuestas:
En Express ya está hecho para usted y simplemente puede usar req.query para eso:
var id = req.query.id; // $_GET["id"]
De lo contrario, en NodeJS, puede acceder a req.url y al url
módulo integrado para [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
(que es diferente de req.params
... ver más abajo.
request
y no tiene nada que ver con Express. Vea la respuesta de @ whitequark a continuación (uso request.query
)
Como ha mencionado Express.js en sus etiquetas, aquí hay una respuesta específica de Express: use req.query . P.ej
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
req.query.id
, no es necesario usar la notación de corchetes.
En Express, use req.query
.
req.params
solo obtiene los parámetros de ruta, no los parámetros de cadena de consulta. Consulte la documentación de express o Sails :
(req.params) Comprueba los parámetros de ruta, por ejemplo: / user /: id
(req.query) Comprueba los parámetros de la cadena de consulta, por ejemplo:? id = 12 Comprueba los parámetros del cuerpo urlencoded
(req.body), ej: id = 12 Para utilizar cuerpos de solicitud codificados por urlen, req.body debe ser un objeto. Esto se puede hacer utilizando el middleware _express.bodyParser.
Dicho esto, la mayoría de las veces, desea obtener el valor de un parámetro independientemente de su origen. En ese caso, use req.param('foo')
.
El valor del parámetro se devolverá si la variable estaba en los parámetros de ruta, cadena de consulta o el cuerpo de solicitud codificado.
Nota al margen: si desea obtener la intersección de los tres tipos de parámetros de solicitud (similar a PHP $_REQUEST
), solo necesita fusionar los parámetros juntos: así es como lo configuré en Sails . Tenga en cuenta que el objeto de parámetros de ruta / ruta ( req.params
) tiene propiedades de matriz, por lo que el orden es importante (aunque esto puede cambiar en Express 4 )
req.params
los documentos de Sails: sailsjs.org/#/documentation/reference/req/req.params.html y los nuevos documentos express: expressjs.com/4x/api.html#req.params
req.param()
es probable que la función auxiliar se elimine por completo en Express 5. Esto no será inminente hasta algún tiempo más tarde en 2017, así que esperaré para editar Esta respuesta hasta entonces. Mientras tanto: es seguro de usar req.param()
con Express <= 3.x / Sails <= 0.12, y con la última versión disponible de Express 4, aunque con un mensaje de registro de obsolescencia. (Para los usuarios de velas: La implementación de req.param()
se moverá en el núcleo como de las Velas v1.0, y va a seguir apoyando plenamente en Velas en el futuro.)
Para Express.js que quieres hacer req.params
:
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Aprendí de las otras respuestas y decidí usar este código en todo mi sitio:
var query = require('url').parse(req.url,true).query;
Entonces puedes llamar
var id = query.id;
var option = query.option;
donde debe estar la URL para obtener
/path/filename?id=123&option=456
parse
en req.url
los convertidos a un objeto.
Si está utilizando ES6 y Express , pruebe este destructuring
enfoque:
const {id, since, fields, anotherField} = request.query;
En contexto:
const express = require('express');
const app = express();
app.get('/', function(req, res){
const {id, since, fields, anotherField} = req.query;
});
app.listen(3000);
También puede usar valores predeterminados 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)
Hay 2 formas de pasar parámetros a través del método GET
Método 1: El enfoque MVC donde pasa los parámetros como / routename /: paramname
En este caso puede usar req.params.paramname para obtener el valor del parámetro. Por ejemplo, consulte el siguiente código donde I Espero que Id como un
enlace param pueda ser como: 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);
Método 2: Enfoque general: pasar variables como cadena de consulta usando '?' operador
Por ejemplo, consulte el código a continuación donde espero Id como un
enlace de parámetro de consulta podría ser: 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);
Deberías poder hacer algo como esto:
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")
})
ACTUALIZACIÓN 4 de mayo de 2014
Antigua respuesta conservada aquí: https://gist.github.com/stefek99/b10ed037d2a4a323d638
1) Instalar 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) Ejecute la aplicación: node app.js
3) Visita en el navegador: http://localhost:3000/endpoint?id=something
He recibido la identificación: algo
(Muchas cosas han cambiado desde mi respuesta y creo que vale la pena mantenerlas actualizadas)
Un pequeño servidor HTTP Node.js que escucha en el puerto 9080, analiza los datos GET o POST y los envía de vuelta al cliente como parte de la respuesta es:
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
Guárdelo como y ejecútelo en la consola ingresando "node parse.js".
Whitequark respondió amablemente. Pero con las versiones actuales de Node.js y Express.js requiere una línea más. Asegúrese de agregar el 'requerir http' (segunda línea). He publicado un ejemplo más completo aquí que muestra cómo puede funcionar esta llamada. Una vez que se ejecute, escriba http://localhost:8080/?name=abel&fruit=apple
su navegador y obtendrá una buena respuesta basada en el código.
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'));
})
Es tan simple:
URL de ejemplo:
http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
Puede imprimir todos los valores de la cadena de consulta utilizando:
console.log("All query strings: " + JSON.stringify(req.query));
Salida
Todas las cadenas de consulta: {"id": "3", "enablekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}
Para imprimir en específico:
console.log("activatekey: " + req.query.activatekey);
Salida
Activar clave: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK
En express.js
puedes hacerlo bastante fácil, todo lo que necesitas hacer en la función de tu controlador es:
app.get('/', (req, res, next) => {
const {id} = req.query;
// rest of your code here...
})
Y eso es todo, suponiendo que esté utilizando la sintaxis es6.
PD. {id}
significa Object destructuring
, una nueva característica es6.
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Puede usar esto o puede probar body-parser para analizar elementos especiales de los parámetros de solicitud.
En realidad es simple:
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
puede usar el módulo url para recopilar parámetros usando url.parse
var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;
En expressjs se hace por,
var id = req.query.id;
P.ej:
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
});
En Express, simplemente podemos usar req.query.<name>
. Funciona igual que $_GET['name']
en PHP.
Desde mi punto de vista, creo que muchas personas mezclan dos conceptos diferentes. Durante el desarrollo de REST estaba familiarizado con pasar información en la URL con dos formas de "variables de ruta" y "parámetros de solicitud" (parámetros de consulta). El RFC describe las partes de URI de esta manera: ingrese la descripción del enlace aquí Así que entendí que el autor desea saber cómo pasar los parámetros de solicitud. Solo quisiera hacer que el tema sea más fácil de entender, pero la solución se mencionó aquí muchas veces.
Puede obtener parámetros de consulta del URI con request.query.<name of the parameter>
, la segunda solución mencionada fue request.params.<name of the parameter>
y con esto puede obtener las variables de ruta.
Por lo tanto, hay dos formas en que se puede recibir esta "identificación": 1) usando parámetros: los parámetros de código se verán así: Digamos que tenemos una matriz,
const courses = [{
id: 1,
name: 'Mathematics'
},
{
id: 2,
name: 'History'
}
];
Luego, para los parámetros, podemos hacer algo como:
app.get('/api/posts/:id',(req,res)=>{
const course = courses.find(o=>o.id == (req.params.id))
res.send(course);
});
2) Otro método es usar parámetros de consulta. entonces la url se verá como "..... \ api \ xyz? id = 1" donde "? id = 1" es la parte de la consulta. En este caso podemos hacer algo como:
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);
Si alguna vez necesita enviar una GET
solicitud a un IP
así como a Domain
(Otras respuestas no mencionaron que puede especificar una port
variable), puede hacer uso de esta función:
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);
});
}
No se pierda requerir módulos en la parte superior de su archivo:
http = require("http");
url = require('url')
También tenga en cuenta que puede usar el https
módulo para comunicarse a través de dominios seguros y SSL. entonces estas dos líneas cambiarían:
https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
Estoy usando MEANJS 0.6.0 con express@4.16, es bueno
Cliente:
Controlador:
var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)
servicios:
this.getOrder = function (input) {return $http.get('/api/order', { params: input });};
Servidor
rutas
app.route('/api/order').get(products.order);
controlador
exports.order = function (req, res) {
var keyword = req.query.keyword
...
-------- Acceso a los datos de la cadena de consulta -------
Supongamos que este es el enlace http://webapplog.com/search?term=node.js&page=1
Entonces, en express puedes usar:
req.query.term
req.query.page
o req.query
(buscará la consulta en un objeto)
app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{
res.json({term:req.query.term, page:req.query.page})
})
-------- Acceso a los parámetros de URL -------
Supongamos que este es el enlace http://webapplog.com/node.js/pages/100
Por lo tanto, en express puede usar:
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})
})