Como obter variáveis ​​GET (string de consulta) no Express.js no Node.js?

1193

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?

XMen
fonte
6
A resposta de @ whitequark (aquela com mais votos) deve ser marcada como a resposta correta. Você se importa de atualizá-lo para outras pessoas com a mesma pergunta que você?
Dev01
Use o objeto consulta no pedido expresso - aqui estão exemplos usando consulta pedido expresso
drorw
@ Dev01 ele não está ativo desde 2014 lol
John Balvin Arias
Se alguém estiver procurando pelo clichê da API do Nodejs com Expressjs e MongoDB. Tente isso: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Respostas:

1183

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 urlmó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;
Marcus Granström
fonte
24
atenção aqui: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz 30/06
Que funcionalidade adicional / melhor o hapi fornece (se houver)?
BaltoStar
180
Isso é aceito, mas não é a resposta preferida. Ver abaixo! usereq.query
Cheeso 23/08
2
A resposta de mikemcneil abaixo é uma escolha melhor. Use req.queryor req.param(o que é diferente de req.params... veja abaixo.
MindJuice
9
-1 . O código acima é um peso morto - algo que um bom desenvolvedor refatorará no local. Esta é uma resposta para " Como obter a string de consulta de um URL? " - o URL em questão está em um objeto chamado requeste não tem nada a ver com o Express. Veja a resposta de @ whitequark abaixo (use request.query)
lunohodov
1649

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);
whitequark
fonte
68
Vale ressaltar que você deve usar req.query.id, não há necessidade de usar a notação de colchete.
28413 alex
Para instalar o express, faça: yes | sudo npm install -g express --- Tentei editar, mas Alexis King foi revertido.
Felipe
na pergunta, ele estava procurando uma maneira de obter todos os parâmetros da string de consulta como uma matriz. A resposta correta é esta: app.get ('/', function (req, res) {console.log (req.query);});
Richard Torcato
463

No Express, use req.query.

req.paramsobté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 )

mikermcneil
fonte
req.param ('STRING') é a resposta correta. Veja aqui: stackoverflow.com/questions/17007997/... (desloque-se para resposta abaixo a resposta aceita)
Joseph Juhnke
3
@deltab aqui está um link req.paramsnos documentos do Sails: sailsjs.org/#/documentation/reference/req/req.params.html e os novos documentos expressos: expressjs.com/4x/api.html#req.params
mikermcneil
7
O req.param foi descontinuado no express 4.x, em vez disso, use req.params, req.body ou req.query: expressjs.com/en/4x/api.html#req.param
swang
@swang está certo - verifiquei duas vezes recentemente com Doug Wilson sobre isso, e a 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.)
mikermcneil
142

Para o Express.js, você quer fazer req.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});
Cris-O
fonte
8
para recuperar variáveis ​​GET no express.js, você pode usar req.query.
Ben Sinclair
6
@Andy req.params é melhor porque: req.param (name [, default]) retornará o valor do nome do parâmetro quando presente ou padrão. Verifica os parâmetros de rota (req.params), ex: / user /: id Verifica os parâmetros de cadeia de consulta (req.query), ex:? Id = 12Verifica os parâmetros de corpo com código de URL (req.body), ex: id = 12 Para utilizar a solicitação com URL corpos, req.body deve ser um objeto. Isso pode ser feito usando o middleware _express.bodyParser.
Cris-O
Eu não sabia que o req.param verifica o req.query, obrigado por esta observação.
perfil completo de Ben Sinclair
3
req.param ('parameterName') verificará req.body, req.query e req.params, mas se você quiser todos os parâmetros de consulta como um objeto, use req.query.
Mckmcneil
1
@mikermcneil você provavelmente misturou req.param () e req.params (objeto). De acordo com o expressjs docs, req.param () procura valor nos três objetos. expressjs.com/api.html#req.param
Ben Sinclair
78

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
Grant Li
fonte
2
id e opção não serão indefinidos, pois a consulta é apenas uma string? teríamos que analisar os dois parâmetros separados com uma regex ou algo parecido.
Ossek #
1
@ossek Eu acredito que o ato de causar parseon req.urlconvertidos para um objeto.
Whitfin
1
@ossek, ele forneceu true como um segundo argumento para url.parse, que faz a propriedade da consulta apontar para um objeto (e que usa internamente o módulo querystring), você pode encontrar mais sobre isso nos documentos [aqui] ( nodejs.org/docs / mais recente / api /… )
Bharat
Trabalhou .... muito obrigado !!!
Prateek Gupta
50
//get query&params 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"}

})
Grande chefe
fonte
48

Se você estiver usando o ES6 e o Express , tente esta destructuringabordagem:

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)

Steven Spungin
fonte
Usando a destruição de objetos com valores padrão! +1
Desenvolvedor líder
43

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);
Omkar Bandkar
fonte
40

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")
})
RobertPitt
fonte
26

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)

Mars Robertson
fonte
20

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.jse execute-o no console digitando "node parse.js".

adriano72
fonte
3
você não precisa exigir sys neste exemplo
danwellman
20

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=appleseu 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'));
})
james d'angelo
fonte
15

É 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

Saran Pal
fonte
13

Você pode usar

request.query.<varible-name>;
Yash Bele
fonte
13

Você pode usar com express ^ 4.15.4:

var express = require('express'),
    router = express.Router();
router.get('/', function (req, res, next) {
    console.log(req.query);
});

Espero que isto ajude.

ajafik
fonte
6

Para express.jsvocê 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 destructuringum novo recurso do es6.

Kevin Alemán
fonte
Estou usando express com node, então isso funcionou perfeitamente para mim. Obrigado!
user752746
4
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.

Mehedi Abdullah
fonte
1
Você pode explicar melhor como isso responde à pergunta?
Nico Haase
E como isso analisa uma lista de parâmetros existente?
Nico Haase
você pode usar o módulo corpo-analisador de node.js
Mehedi Abdullah
1

É 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
Md. A. Barik
fonte
0

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
});
Codemaker
fonte
0

No Express, podemos simplesmente usar req.query.<name>. É o mesmo que $_GET['name']no PHP.

Ankit Singh
fonte
0

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.

Peter S.
fonte
0

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);
});
abcbc
fonte
0
var express = require('express');
var app = express();

app.get('/', function(req, res){
  res.send('id: ' + req.query.id);
});

app.listen(3000);
Sarthak Dalabehera
fonte
0

Se você precisar enviar uma GETsolicitação a uma IPe também a Domain(Outras respostas não mencionaram que você pode especificar uma portvariá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 httpsmó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) => { ......
AmiNadimi
fonte
-1

por que não misturado com o código do servidor

por exemplo . php

<script>
var ip=<?php echo($_SERVER['REMOTE_ADDR']);?>

</script>
chings228
fonte
-2

Estou usando o MEANJS 0.6.0 com [email protected], é 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
  ...
Tính Ngô Quang
fonte
-3

-------- 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)

    // Exemplo
    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

    // Exemplo
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
Moulali M
fonte