Podemos obter as variáveis na string de consulta no Node.js da mesma forma que as $_GET
no PHP?
Eu sei que no Node.js podemos obter o URL na solicitação. Existe um método para obter os parâmetros da string de consulta?
Podemos obter as variáveis na string de consulta no Node.js da mesma forma que as $_GET
no PHP?
Eu sei que no Node.js podemos obter o URL na solicitação. Existe um método para obter os parâmetros da string de consulta?
Respostas:
No Express, isso já foi feito para você e você pode simplesmente usar o req.query para isso:
var id = req.query.id; // $_GET["id"]
Caso contrário, no NodeJS, você pode acessar o req.url e o url
módulo interno 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
or req.param
(o que é diferente de req.params
... veja abaixo.
request
e não tem nada a ver com o Express. Veja a resposta de @ whitequark abaixo (use request.query
)
Como você mencionou o Express.js em suas tags, eis uma resposta específica do Express: use req.query . Por exemplo
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send('id: ' + req.query.id);
});
app.listen(3000);
req.query.id
, não há necessidade de usar a notação de colchete.
No Express, use req.query
.
req.params
obtém apenas os parâmetros da rota, não os parâmetros da string de consulta. Consulte a documentação expressa ou de velas :
(req.params) Verifica os parâmetros da rota, por exemplo: / user /: id
(req.query) Verifica os parâmetros da string de consulta, ex:? id = 12 Verifica os parâmetros do corpo codificado por url
(req.body), ex: id = 12 Para utilizar corpos de solicitação codificados por url, req.body deve ser um objeto. Isso pode ser feito usando o middleware _express.bodyParser.
Dito isto, na maioria das vezes, você deseja obter o valor de um parâmetro, independentemente de sua origem. Nesse caso, use req.param('foo')
.
O valor do parâmetro será retornado, independentemente da variável estar nos parâmetros de rota, na sequência de consultas ou no corpo da solicitação codificada.
Nota lateral - se você deseja obter a interseção de todos os três tipos de parâmetros de solicitação (semelhantes aos do PHP $_REQUEST
), basta mesclar os parâmetros - eis como eu o configurei no Sails . Lembre-se de que o objeto de parâmetros de caminho / rota ( req.params
) possui propriedades de matriz, portanto, a ordem é importante (embora isso possa mudar no Express 4 )
req.params
nos documentos do Sails: sailsjs.org/#/documentation/reference/req/req.params.html e os novos documentos expressos: expressjs.com/4x/api.html#req.params
req.param()
função auxiliar provavelmente será completamente removida no Express 5. Isso não será iminente até algum tempo depois em 2017, então vou esperar para editar esta resposta até então. Enquanto isso: é seguro usar req.param()
com o Express <= 3.x / Sails <= 0.12 e com a versão mais recente disponível do Express 4, embora com uma mensagem de log de descontinuação. (Para usuários de velas: A implementação req.param()
vai passar para núcleo como das Velas v1.0, e vai continuar a ser totalmente suportado no Sails no futuro.)
Para o Express.js, você quer fazer req.params
:
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Aprendi com as outras respostas e decidi usar esse código em todo o site:
var query = require('url').parse(req.url,true).query;
Então você pode simplesmente ligar
var id = query.id;
var option = query.option;
onde o URL para get deve estar
/path/filename?id=123&option=456
parse
on req.url
convertidos para um objeto.
//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 você estiver usando o ES6 e o Express , tente esta destructuring
abordagem:
const {id, since, fields, anotherField} = request.query;
No contexto:
const express = require('express');
const app = express();
app.get('/', function(req, res){
const {id, since, fields, anotherField} = req.query;
});
app.listen(3000);
Você também pode usar valores padrão com 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)
Existem 2 maneiras de passar parâmetros através do método GET
Método 1: A abordagem MVC onde você passa os parâmetros como / routename /: paramname
Nesse caso, você pode usar req.params.paramname para obter o valor do parâmetro Por exemplo, consulte o código abaixo, onde I estou esperando o Id como um
link param poderia 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: Abordagem geral: Passando variáveis como string de consulta usando '?' operator
Por exemplo, consulte o código abaixo, no qual estou esperando o ID como um
link de parâmetro de consulta : 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);
Você deve conseguir fazer algo assim:
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")
})
ATUALIZAÇÃO 4 de maio de 2014
Resposta antiga preservada aqui: https://gist.github.com/stefek99/b10ed037d2a4a323d638
1) Instale expresso: 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) Execute o aplicativo: node app.js
3) Visita no navegador: http://localhost:3000/endpoint?id=something
Eu recebi o ID: algo
(muitas coisas mudaram desde a minha resposta e acredito que vale a pena manter as coisas atualizadas)
Um pequeno servidor HTTP Node.js que atende na porta 9080, analisando dados GET ou POST e enviando-os de volta ao cliente como parte da resposta é:
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);
Salve-o como parse.js
e execute-o no console digitando "node parse.js".
Whitequark respondeu bem. Mas com as versões atuais do Node.js e Express.js, é necessária mais uma linha. Certifique-se de adicionar o 'exigir http' (segunda linha). Publiquei um exemplo mais completo aqui que mostra como essa chamada pode funcionar. Depois de executar, digite http://localhost:8080/?name=abel&fruit=apple
seu navegador e você receberá uma resposta interessante com base no 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'));
})
É tão simples:
URL de exemplo:
http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK
Você pode imprimir todos os valores da string de consulta usando:
console.log("All query strings: " + JSON.stringify(req.query));
Resultado
Todas as cadeias de consulta: {"id": "3", "activekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}
Para imprimir específico:
console.log("activatekey: " + req.query.activatekey);
Resultado
activekey: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK
Para express.js
você ficar bem fácil, tudo que você precisa fazer na sua função de controlador é:
app.get('/', (req, res, next) => {
const {id} = req.query;
// rest of your code here...
})
E isso é tudo, supondo que você esteja usando a sintaxe es6.
PD. {id}
significa Object destructuring
um novo recurso do es6.
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
Você pode usar isso ou tentar o analisador de corpo para analisar o elemento especial a partir dos parâmetros de solicitação.
É realmente simples:
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
você pode usar o módulo url para coletar parâmetros usando url.parse
var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;
No expressjs, é feito por,
var id = req.query.id;
Por exemplo:
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
});
No Express, podemos simplesmente usar req.query.<name>
. É o mesmo que $_GET['name']
no PHP.
Do meu ponto de vista, acho que muitas pessoas misturam dois conceitos diferentes. Durante o desenvolvimento do REST, eu estava familiarizado com a transmissão de informações na URL com duas maneiras "variáveis de caminho" e "parâmetros de solicitação" (parâmetros de consulta). O RFC descreve as partes do URI assim: insira a descrição do link aqui Então eu entendi que o autor gostaria de saber como passar parâmetros de solicitação. Gostaria apenas de tornar o tópico mais fácil de entender, mas a solução foi mencionada aqui várias vezes.
Você pode obter parâmetros de consulta do URI com request.query.<name of the parameter>
a segunda solução mencionada request.params.<name of the parameter>
e com isso você pode obter as variáveis de caminho.
Portanto, existem duas maneiras pelas quais esse "id" pode ser recebido: 1) usando params: os params de código terão a seguinte aparência: digamos que temos uma matriz,
const courses = [{
id: 1,
name: 'Mathematics'
},
{
id: 2,
name: 'History'
}
];
Então, para os parâmetros, podemos fazer algo como:
app.get('/api/posts/:id',(req,res)=>{
const course = courses.find(o=>o.id == (req.params.id))
res.send(course);
});
2) Outro método é usar parâmetros de consulta. portanto, o URL será algo como "..... \ api \ xyz? id = 1" onde "? id = 1" é a parte da consulta. Nesse caso, podemos fazer 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);
Se você precisar enviar uma GET
solicitação a uma IP
e também a Domain
(Outras respostas não mencionaram que você pode especificar uma port
variável), você poderá fazer uso desta função:
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);
});
}
Não perca a exigência de módulos na parte superior do seu arquivo:
http = require("http");
url = require('url')
Lembre-se também de que você pode usar o https
módulo para se comunicar sobre domínios seguros e SSL. então essas duas linhas mudariam:
https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
Estou usando o MEANJS 0.6.0 com express@4.16, é bom
Cliente:
Controlador:
var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)
Serviços:
this.getOrder = function (input) {return $http.get('/api/order', { params: input });};
Servidor
rotas
app.route('/api/order').get(products.order);
controlador
exports.order = function (req, res) {
var keyword = req.query.keyword
...
-------- Acessando dados da string de consulta -------
Suponha que este seja o link http://webapplog.com/search?term=node.js&page=1
Então, no expresso, você pode usar:
req.query.term
req.query.page
ou req.query
(ele buscará a consulta em um objeto)
app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{
res.json({term:req.query.term, page:req.query.page})
})
-------- Acessando parâmetros de URL -------
Suponha que este seja o link http://webapplog.com/node.js/pages/100
Portanto, no express, você pode 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})
})