Как получить переменные GET (строка запроса) в Express.js на Node.js?

1193

Можем ли мы получить переменные в строке запроса в Node.js так же, как мы получаем их $_GETв PHP?

Я знаю, что в Node.js мы можем получить URL в запросе. Есть ли способ получить параметры строки запроса?

XMen
источник
6
Ответ @ whitequark (тот, который набрал наибольшее количество голосов) должен быть помечен как правильный ответ. Не возражаете ли вы обновить его для других с тем же вопросом, что и вы, который наткнулся на ваш вопрос?
Dev01
Используйте объект запроса в экспресс-запросе - вот примеры использования экспресс-запроса
drorw
@ Dev01 он не активен с 2014 года лол
Джон Балвин Ариас
Если кто-то ищет шаблон Nodejs API с Expressjs и MongoDB. Попробуйте это: github.com/maitraysuthar/rest-api-nodejs-mongodb
Майтрей Сутар

Ответы:

1183

В Express это уже сделано для вас, и вы можете просто использовать req.query для этого:

var id = req.query.id; // $_GET["id"]

В противном случае в NodeJS вы можете получить доступ к req.url и встроенному urlмодулю для [url.parse] ( https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost ) его вручную:

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
Маркус Гранстрем
источник
24
внимание здесь: .parse (url, true ) url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz
Какой дополнительный / лучший функционал предоставляет хапи (если есть)?
BaltoStar
180
Это принято, но это не предпочтительный ответ. См. ниже! использованиеreq.query
Cheeso
2
Ответ mikemcneil ниже - лучший выбор. Используйте req.queryили req.param(что отличается от req.params... см. Ниже.
MindJuice
9
-1 . Вышеприведенный код является дедвейтом - что-то хорошее, что разработчик будет рефакторинг на месте. Это ответ на вопрос « Как получить строку запроса URL-адреса? » - рассматриваемый URL-адрес просто находится в названном объекте requestи не имеет ничего общего с Express. Смотрите ответ @ whitequark ниже (используйте request.query)
lunohodov
1649

Поскольку вы упомянули Express.js в своих тегах, вот специальный ответ Express: используйте req.query . Например

var express = require('express');
var app = express();

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

app.listen(3000);
whitequark
источник
68
Стоит упомянуть, что вы должны использовать req.query.id, нет необходимости использовать скобки.
Алекс
Для установки экспресс сделать это: да | sudo npm install -g express --- Я пытался редактировать, но Алексис Кинг была отменена.
Фелипе
в вопросе он искал способ получить все параметры строки запроса, например, массив. Правильный ответ: app.get ('/', function (req, res) {console.log (req.query);});
Ричард Торкато
463

В Express используйте req.query.

req.paramsполучает только параметры маршрута, а не параметры строки запроса. Смотрите экспресс или паруса документации:

(req.params) Проверяет параметры маршрута, например: / user /: id

(req.query) Проверяет параметры строки запроса, например:? id = 12 Проверяет параметры тела в кодировке urlencoded

(req.body), ex: id = 12 Для использования тел запросов с урлен-кодом req.body должен быть объектом. Это можно сделать с помощью промежуточного программного обеспечения _express.bodyParser.

Тем не менее, в большинстве случаев вы хотите получить значение параметра независимо от его источника. В этом случае используйте req.param('foo').

Значение параметра будет возвращено независимо от того, была ли переменная в параметрах маршрута, строке запроса или в зашифрованном теле запроса.

Примечание: если вы хотите пересечь все три типа параметров запроса (аналогично PHP $_REQUEST), вам просто нужно объединить параметры вместе - вот как я это настроил в Sails . Имейте в виду, что у объекта параметров пути / маршрута req.paramsесть свойства массива, поэтому порядок имеет значение (хотя это может измениться в Express 4 )

mikermcneil
источник
req.param ('STRING') является правильным ответом. См. Здесь: stackoverflow.com/questions/17007997/… (прокрутите вниз, чтобы ответить ниже принятого ответа)
Джозеф Юнке
3
@deltab вот ссылка req.paramsна документы Sails: sailsjs.org/#/documentation/reference/req/req.params.html и новые экспресс-документы: expressjs.com/4x/api.html#req.params
mikermcneil
7
req.param устарела в Express 4.x, вместо этого следует использовать req.params, req.body или req.query: expressjs.com/en/4x/api.html#req.param
swang
@swang прав - недавно я дважды проверил это с Дагом Уилсоном по этому поводу, и req.param()вспомогательная функция, вероятно, будет полностью удалена в Express 5. Это не будет неизбежно до некоторого времени позже в 2017 году, поэтому я подожду редактировать этот ответ до тех пор. В то же время: безопасно использовать req.param()с Express <= 3.x / Sails <= 0.12 и с последней доступной версией Express 4, хотя и с сообщением журнала устаревания. (Для пользователей Sails: реализация req.param()Sails v1.0 перейдет в ядро, и в дальнейшем она будет полностью поддерживаться в Sails.)
mikermcneil
142

Для Express.js вы хотите сделать req.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});
Cris-О
источник
8
чтобы получить переменные GET в express.js, вы можете использовать req.query.
Бен Синклер
6
@Andy req.params лучше, потому что: req.param (name [, default]) будет: Возвращать значение имени параметра, если оно присутствует или используется по умолчанию. Проверяет параметры маршрута (req.params), например: / user /: id Проверяет параметры строки запроса (req.query), например:? Id = 12Проверяет параметры тела с urlencoded (req.body), например: id = 12 Чтобы использовать запрос с urlencoded тел, req.body должен быть объектом. Это можно сделать с помощью промежуточного программного обеспечения _express.bodyParser.
Cris-O
Я не знал req.param проверок для req.query, спасибо за эту заметку.
Бен Синклер
3
req.param ('parameterName') проверит req.body, req.query и req.params, но если вы хотите, чтобы все параметры запроса были объектами, вы должны использовать req.query.
mikermcneil
1
@mikermcneil вы, вероятно, перепутали req.param () и req.params (объект). Согласно expressjs docs, req.param () ищет значение во всех трех объектах. expressjs.com/api.html#req.param
Бен Синклер,
78

Я учился на других ответах и ​​решил использовать этот код на своем сайте:

var query = require('url').parse(req.url,true).query;

Тогда вы можете просто позвонить

var id = query.id;
var option = query.option;

где должен быть URL для получения

/path/filename?id=123&option=456
Грант Ли
источник
2
не будет ли идентификатор и опция неопределенными, так как запрос - это просто строка? мы должны были бы разобрать два отдельных параметра с помощью регулярного выражения или тому подобного.
ossek
1
@ossek Я считаю , что акт нанесения parseна req.urlобращенных к объекту.
whitfin
1
@ossek, он предоставил true в качестве второго аргумента для url.parse, который заставляет свойство запроса указывать на объект (и который внутренне использует модуль querystring), вы можете узнать больше об этом в docs [здесь] ( nodejs.org/docs) / последний / API / ... )
Бхарат
Работал .... большое спасибо !!!
Пратик Гупта
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"}

})
большой босс
источник
48

Если вы используете ES6 и Express , попробуйте этот destructuringподход:

const {id, since, fields, anotherField} = request.query;

В контексте:

const express = require('express');
const app = express();

app.get('/', function(req, res){
   const {id, since, fields, anotherField} = req.query;
});

app.listen(3000);

Вы также можете использовать значения по умолчанию с 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)

Стивен Спунгин
источник
Использование деструктуризации объекта со значениями по умолчанию! +1
ведущий разработчик
43

Есть 2 способа передачи параметров с помощью метода GET.

Метод 1. Подход MVC, в котором вы передаете такие параметры, как / routename /: paramname.
В этом случае вы можете использовать req.params.paramname, чтобы получить значение параметра. Например, см. Код ниже, где я Я ожидаю, что Id в качестве
ссылки может быть как: 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);

Метод 2: Общий подход: передача переменных в виде строки запроса с использованием '?' оператор
Например, обратитесь к приведенному ниже коду, где я ожидаю, что Id в качестве
ссылки на параметр запроса может выглядеть следующим образом: 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);
Омкар Бандкар
источник
40

Вы должны быть в состоянии сделать что-то вроде этого:

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
источник
26

ОБНОВЛЕНИЕ 4 мая 2014

Старый ответ сохранился здесь: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Установите экспресс: 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) Запустите приложение: node app.js

3) Зайдите в браузер: http://localhost:3000/endpoint?id=something

Я получил удостоверение личности: что-то


(с момента моего ответа многое изменилось, и я считаю, что это стоит держать в курсе)

Марс Робертсон
источник
20

Небольшой HTTP-сервер Node.js, прослушивающий порт 9080, анализирующий данные GET или POST и отправляющий их обратно клиенту как часть ответа:

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и запустите на консоли, введя "node parse.js".

adriano72
источник
3
вам не нужно требовать sys в этом примере
danwellman
20

Whitequark ответил хорошо. Но в текущих версиях Node.js и Express.js требуется еще одна строка. Обязательно добавьте 'require http' (вторая строка). Я разместил здесь более полный пример, который показывает, как этот вызов может работать. После запуска введите http://localhost:8080/?name=abel&fruit=appleв браузере, и вы получите крутой ответ на основе кода.

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'));
})
Джеймс д'Анджело
источник
15

Это так просто:

Пример URL:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK

Вы можете распечатать все значения строки запроса, используя:

console.log("All query strings: " + JSON.stringify(req.query));

Вывод

Все строки запроса: {"id": "3", "activkey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Для печати конкретного:

console.log("activatekey: " + req.query.activatekey);

Вывод

Ключ активации: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK

Саран Пал
источник
13

Ты можешь использовать

request.query.<varible-name>;
Яш Беле
источник
13

Вы можете использовать с экспрессом ^ 4.15.4:

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

Надеюсь это поможет.

ajafik
источник
6

В express.jsвы можете получить его довольно легко, все , что вам нужно сделать в функции контроллера является:

app.get('/', (req, res, next) => {
   const {id} = req.query;
   // rest of your code here...
})

И это все, если вы используете синтаксис es6.

Оплаченный {id}расшифровывается Object destructuringкак новая функция es6.

Кевин Алеман
источник
Я использую экспресс с узлом, так что это отлично сработало для меня. Спасибо!
user752746
4
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

Вы можете использовать это или попробовать body-parser для разбора специального элемента из параметров запроса.

Мехеди Абдулла
источник
1
Можете ли вы объяснить, как это отвечает на вопрос?
Нико Хаазе
И как это анализирует существующий список параметров?
Нико Хаазе
вы можете использовать модуль body-parser из node.js
Мехеди Абдулла,
1

Это на самом деле просто:

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
Г-н А. Барик
источник
0

Вы можете использовать модуль url для сбора параметров с помощью url.parse

var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;

В экспрессе это сделано,

var id = req.query.id;

Например:

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
источник
0

В Express мы можем просто использовать req.query.<name>. Это работает так же, как $_GET['name']в PHP.

Анкит Сингх
источник
0

С моей точки зрения, я думаю, что многие люди смешивают два разных понятия. Во время разработки REST я был знаком с передачей информации в URL двумя способами: «переменные пути» и «параметры запроса» (параметры запроса). RFC описывает части URI следующим образом: введите здесь описание ссылки. Я понял, что автору хотелось бы знать, как передавать параметры запроса. Я хотел бы только облегчить понимание темы, но решение упоминалось здесь много раз.

Вы можете получить параметры запроса из URI с request.query.<name of the parameter>, второе упомянутое решение было, request.params.<name of the parameter>и с этим вы можете получить переменные пути.

Питер С.
источник
0

Таким образом, есть два способа получения этого «идентификатора»: 1) использование параметров: параметры кода будут выглядеть примерно так: скажем, у нас есть массив,

const courses = [{
    id: 1,
    name: 'Mathematics'
},
{
    id: 2,
    name: 'History'
}
];

Тогда для параметров мы можем сделать что-то вроде:

app.get('/api/posts/:id',(req,res)=>{
    const course = courses.find(o=>o.id == (req.params.id))
    res.send(course);
});

2) Другой метод заключается в использовании параметров запроса. поэтому URL будет выглядеть примерно так: «..... \ api \ xyz? id = 1», где «? id = 1» - это часть запроса. В этом случае мы можем сделать что-то вроде:

app.get('/api/posts',(req,res)=>{
    const course = courses.find(o=>o.id == (req.query.id))
    res.send(course);
});
abcbc
источник
0
var express = require('express');
var app = express();

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

app.listen(3000);
Сартак Далабехера
источник
0

Если вам когда-либо понадобится отправить GETзапрос IPкак a, так и a Domain(в других ответах не упоминалось, что вы можете указать portпеременную), вы можете использовать эту функцию:

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

Не пропустите обязательные модули в верхней части вашего файла:

http = require("http");
url = require('url')

Также помните, что вы можете использовать httpsмодуль для связи по защищенным доменам и ssl. поэтому эти две строки изменились бы:

https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
AmiNadimi
источник
-1

почему не смешивается с кодом сервера

например PHP

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

</script>
chings228
источник
-2

Я использую MEANJS 0.6.0 с express@4.16, это хорошо

Клиент:

контроллер:

var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)

Сервисы:

this.getOrder = function (input) {return $http.get('/api/order', { params: input });};

сервер

маршруты

app.route('/api/order').get(products.order);

контроллер

exports.order = function (req, res) {
  var keyword = req.query.keyword
  ...
Тинь Нго Куанг
источник
-3

-------- Доступ к данным строки запроса -------
Предположим, что это ссылка http://webapplog.com/search?term=node.js&page=1

Так что в экспрессе вы можете использовать:

  • req.query.term
  • req.query.page или
  • req.query(он извлечет запрос в объекте)

    // Пример
    app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{ res.json({term:req.query.term, page:req.query.page}) })

-------- Доступ к параметрам URL -------
Предположим, что это ссылка http://webapplog.com/node.js/pages/100
Итак, в экспрессе вы можете использовать: 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}) })
Мулали М
источник