Як отримати змінні GET (рядок запиту) у Express.js на Node.js?


1190

Чи можемо ми отримати змінні в рядку запиту в Node.js так само, як ми отримаємо їх $_GETу PHP?

Я знаю, що в Node.js ми можемо отримати URL-адресу в запиті. Чи існує метод отримання параметрів рядка запиту?


6
@ відповідь уайткарка (той, який має найбільше голосів) повинен бути позначений як правильна відповідь. Чи не проти оновлювати його для інших тим самим питанням, що і ви, що натрапляєте на ваше запитання?
Dev01

Використовуйте об’єкт запиту в експрес-запиті - ось приклади використання експрес-запиту
drorw

@ Dev01 він не активний з 2014 року
Джон Балвін Аріас

Якщо хтось шукає кофейну таблицю API Nodejs з Expressjs та MongoDB. Спробуйте це: github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Відповіді:


1178

В 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

1648

Оскільки ви вказали Express.js у своїх тегах, ось відповідь, що стосується експресу: використовуйте req.query . Напр

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

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

app.listen(3000);

67
Варто зазначити, що ви повинні використовувати 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 Перевіряє параметри тіла

(req.body), наприклад: id = 12 Щоб використовувати органи запиту, кодовані урленом, req.body повинен бути об'єктом. Це можна зробити за допомогою проміжного програмного забезпечення _express.bodyParser.

Це означає, що більшу частину часу ви хочете отримати значення параметра незалежно від його джерела. У такому випадку використовуйте req.param('foo').

Значення параметра буде повернуто, чи була змінна в параметрах маршруту, рядку запиту чи закодованому тілі запиту.

Бічна примітка - якщо ви прагнете отримати перетин усіх трьох типів параметрів запиту (схожий на PHP $_REQUEST), вам просто потрібно об'єднати параметри разом - ось як я це налаштував у Sails . Майте на увазі, що об’єкт параметрів шляху / маршруту ( req.params) має властивості масиву, тому замовлення має значення (хоча це може змінитися в Express 4 )


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()функція помічника, ймовірно, буде повністю видалена в Експресі 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);    
});

8
для отримання змінних GET в express.js ви можете використовувати req.query.
Бен Сінклер

6
@Andy req.params краще, тому що: req.param (ім'я [, за замовчуванням]) буде: Повертає значення імені парам, коли він присутній або за замовчуванням. Перевіряє параметри маршруту (req.params), наприклад: / user /: id Перевіряє параметри рядка запиту (req.query), ex:? Id = 12Перевіряє параметри тіла, кодовані урленом (req.body), наприклад: id = 12 Для використання запиту, що кодується urlen органи, 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 (object). За даними 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звернених до об'єкта.
вітфін

1
@ossek, він наданий true як другий аргумент url.parse, який робить властивість запиту вказувати на об’єкт (і який використовує внутрішньо модуль запитів), ви можете дізнатися про нього в документах [тут] ( nodejs.org/docs / останнє / api /… )
Бхарат

Працювали .... велике спасибі !!!
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"}

})

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

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і запустіть на консолі, ввівши "вузол parse.js".


3
вам не потрібно вимагати sys у цьому прикладі
danwellman

20

Уайткварк відповів приємно. Але для поточних версій Node.js та Express.js потрібен ще один рядок. Обов’язково додайте "вимагати 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", "activatekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

Щоб надрукувати конкретні:

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

Вихідні дані

activatekey: $ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK



13

Ви можете використовувати Express @ 4.15.4:

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

Сподіваюсь, це допомагає.


6

У express.jsвас це можна отримати досить просто, все, що вам потрібно зробити в функції контролера:

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

І це все, якщо припустити, що ви використовуєте синтаксис es6.

ПД. {id}розшифровується Object destructuring, нова функція es6.


Я використовую express з вузлом, тому це прекрасно працювало для мене. Дякую!
користувач752746

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

Ви можете використовувати це або ви можете спробувати аналізатор тіла для розбору спеціального елемента з параметрів запиту.


1
Чи можете ви далі пояснити, як це відповідає на питання?
Ніко Хааз

І як це аналізує існуючий список параметрів?
Ніко Хааз

ви можете використовувати модуль аналізатора тіла від 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;

У expressjs це робиться,

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

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

Отже, є два способи отримання цього "id": 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);
});


0

Якщо вам коли-небудь потрібно буде надіслати GETзапит на IPа також 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) => { ......

-1

чому не змішується з кодом сервера

напр. php

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

</script>

-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}) })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.