1316

Can we get the variables in the query string in Node.js just like we get them in $_GET in PHP?

I know that in Node.js we can get the URL in the request. Is there a method to get the query string parameters?

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
XMen
  • 25,629
  • 39
  • 95
  • 148
  • 6
    @whitequark's answer (the one with the most votes) should be marked as the correct answer. Do you mind updating it for others with the same question as you that stumble upon your question? – Dev01 Oct 23 '17 at 19:35
  • Use the query object in express request - here are [examples using express request query](https://www.codota.com/code/javascript/functions/express/Request/query) – drorw Apr 18 '19 at 20:25
  • @Dev01 he is not active since 2014 lol – John Balvin Arias Jul 20 '19 at 04:21
  • If anyone looking for Nodejs API boilerplate with Expressjs and MongoDB. Try this: https://github.com/maitraysuthar/rest-api-nodejs-mongodb – Maitray Suthar Aug 17 '19 at 09:56

23 Answers23

1699

Since you've mentioned Express.js in your tags, here is an Express-specific answer: use req.query. E.g.

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

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

app.listen(3000);
chridam
  • 88,008
  • 19
  • 188
  • 202
whitequark
  • 20,188
  • 3
  • 28
  • 45
  • 70
    Worth mentioning that you should use `req.query.id`, no need to use bracket notation. – alex Feb 28 '13 at 05:40
  • To install express do it: yes | sudo npm install -g express --- I tried to edit but Alexis King have been reverted. – Felipe Feb 02 '15 at 19:43
  • in the question he was looking for a way to get all the query string parameters like an array. The correct answer is this: app.get('/', function(req, res){ console.log(req.query); }); – Richard Torcato Jun 16 '16 at 11:07
1359

In Express it's already done for you and you can simply use req.query for that:

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

Otherwise, in NodeJS, you can access req.url and the builtin url module to url.parse it manually:

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;
Nei
  • 369
  • 2
  • 11
Marcus Granström
  • 16,257
  • 1
  • 19
  • 21
  • 29
    attention here: .parse(url,**true**) `url.parse(urlStr, [parseQueryString], [slashesDenoteHost])` – befzz Jun 30 '13 at 08:15
  • What additional/better functionality does hapi provide ( if any ) ? – BaltoStar Aug 05 '13 at 18:44
  • 191
    This is accepted but it's not the preferred answer. See below! use `req.query` – Cheeso Aug 23 '13 at 03:28
  • 2
    mikemcneil's answer below is a better choice. Use `req.query` or `req.param` (which is different than `req.params`...see below. – MindJuice Jun 19 '14 at 15:14
  • 9
    *-1*. Code above is a deadweight — something a good developer will refactor on the spot. This is an answer to "_How to get the query string of an URL?_" — the URL in question just happens to be in an object named `request` and has nothing to do with Express. See @whitequark's answer below (use `request.query`) – lunohodov Mar 25 '16 at 11:55
  • I don't suppose there's a method to take a group vote on unaccepting this answer and accepting the answer below? I'm terrified how many people this will have misled considering the 400,000 views. – Alexander Craggs Jul 23 '16 at 20:03
  • totally agree, this answer is far from optimal. Why nobody corrected it then for such a long time – Pavel P Aug 28 '16 at 15:54
  • res.send('Response send to client::'+req.query.id); would be a good choice. – nilakantha singh deo Nov 13 '16 at 02:54
  • Seems outdated. @yash-bele answer seems better, as you don't need any extra module. – xurei May 26 '17 at 13:05
  • req.query worked for me! And It is the apropiate for string parameters – Felipe Toledo Mar 25 '19 at 02:39
  • in my case `url.parse(req.url, true).query;` worked – uniqueNt Jul 03 '19 at 05:48
473

In Express, use req.query.

req.params only gets the route parameters, not the query string parameters. See the express or sails documentation:

(req.params) Checks route params, ex: /user/:id

(req.query) Checks query string params, ex: ?id=12 Checks urlencoded body params

(req.body), ex: id=12 To utilize urlencoded request bodies, req.body should be an object. This can be done by using the _express.bodyParser middleware.

That said, most of the time, you want to get the value of a parameter irrespective of its source. In that case, use req.param('foo').

The value of the parameter will be returned whether the variable was in the route parameters, query string, or the encoded request body.

Side note- if you're aiming to get the intersection of all three types of request parameters (similar to PHP's $_REQUEST), you just need to merge the parameters together-- here's how I set it up in Sails. Keep in mind that the path/route parameters object (req.params) has array properties, so order matters (although this may change in Express 4)

Community
  • 1
  • 1
mikermcneil
  • 10,461
  • 5
  • 41
  • 70
  • req.param('STRING') is the correct answer. See here: http://stackoverflow.com/questions/17007997/how-to-access-the-get-parameters-in-express-js-or-node-js (scroll down to answer below the accepted answer) – Joseph Juhnke Nov 06 '14 at 20:07
  • 3
    @deltab here's a link to `req.params` in the Sails docs: http://sailsjs.org/#/documentation/reference/req/req.params.html and the new express docs: http://expressjs.com/4x/api.html#req.params – mikermcneil Jan 23 '15 at 17:24
  • 7
    req.param is deprecated in express 4.x, should use req.params, req.body or req.query instead: http://expressjs.com/en/4x/api.html#req.param – swang Aug 31 '16 at 16:01
  • @swang is right- I double-checked with Doug Wilson recently about this, and the `req.param()` helper function is likely to be completely removed in Express 5. This won't be imminent until some time later in 2017, so I'll wait to edit this answer until then. In the mean time: It's safe to use `req.param()` with Express <=3.x / Sails <=0.12, _and_ with the latest available release of Express 4, albeit w/ a deprecation log message. (For Sails users: The implementation of `req.param()` will move into core as of Sails v1.0, and it will continue to be fully supported in Sails in the future.) – mikermcneil Oct 09 '16 at 01:39
153

For Express.js you want to do req.params:

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Cris-O
  • 4,721
  • 3
  • 15
  • 11
  • 8
    to retrieve GET variables in express.js you can use req.query. – Ben Affleck Dec 16 '11 at 08:40
  • 7
    @Andy req.params is better because: req.param(name[, default]) will: Return the value of param name when present or default. Checks route params (req.params), ex: /user/:id Checks query string params (req.query), ex: ?id=12Checks urlencoded body params (req.body), ex: id=12 To utilize urlencoded request bodies, req.body should be an object. This can be done by using the _express.bodyParser middleware. – Cris-O Dec 18 '11 at 23:19
  • 1
    I didn't know req.param checks for req.query, thanks for this note. – Ben Affleck Dec 19 '11 at 11:14
  • 3
    req.param('parameterName') will check for req.body, req.query, and req.params, but if you want all of the query parameters as an object, you should use req.query. – mikermcneil Feb 11 '12 at 18:51
  • 1
    @mikermcneil you probably mixed up req.param() and req.params (object). According to expressjs docs req.param() looks for value in all three objects. http://expressjs.com/api.html#req.param – Ben Affleck May 02 '13 at 06:48
  • Hey Andy- sorry, I misread your comment and thought you said "req.params" Not enough sleep, I guess! – mikermcneil May 03 '13 at 02:49
83

I learned from the other answers and decided to use this code throughout my site:

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

Then you can just call

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

where the URL for get should be

/path/filename?id=123&option=456
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Grant Li
  • 839
  • 6
  • 2
  • 2
    won't id and option be undefined since query is just a string? we'd have to parse out the two separate parameters with a regex or the like. – ossek Oct 24 '14 at 05:12
  • 1
    @ossek I believe the act of causing `parse` on `req.url` converts to an object. – whitfin Feb 01 '15 at 19:18
  • 1
    @ossek, he's provided true as a second argument to url.parse, which makes the query property point to an object ( and that internally uses querystring module) you can find more about it in the docs [here] (https://nodejs.org/docs/latest/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost) – Bharat Mar 08 '15 at 16:30
59
//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"}

})
Baum mit Augen
  • 46,177
  • 22
  • 136
  • 173
bigboss
  • 591
  • 4
  • 2
50

There are 2 ways to pass parameters via GET method

Method 1 : The MVC approach where you pass the parameters like /routename/:paramname
In this case you can use req.params.paramname to get the parameter value For Example refer below code where I am expecting Id as a param
link could be like : 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);

Method 2 : General Approach : Passing variables as query string using '?' operator
For Example refer below code where I am expecting Id as a query parameter
link could be like : 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);
Nikita Popov
  • 329
  • 4
  • 13
Omkar Bandkar
  • 679
  • 6
  • 4
50

If you are using ES6 and Express, try this destructuring approach:

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

In context:

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

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

app.listen(3000);

You can use default values with destructuring too:

// 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)
iluu
  • 396
  • 2
  • 12
Steven Spungin
  • 17,551
  • 4
  • 57
  • 56
42

You should be able to do something like this:

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")
})
Casey Watson
  • 46,980
  • 10
  • 30
  • 30
RobertPitt
  • 54,473
  • 20
  • 110
  • 156
28

UPDATE 4 May 2014

Old answer preserved here: https://gist.github.com/stefek99/b10ed037d2a4a323d638


1) Install 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) Run the app: node app.js

3) Visit in the browser: http://localhost:3000/endpoint?id=something

I have received the ID: something


(many things have changed since my answer and I believe it is worth keeping things up to date)

Mars Robertson
  • 11,255
  • 10
  • 63
  • 85
21

A small Node.js HTTP server listening on port 9080, parsing GET or POST data and sending it back to the client as part of the response is:

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

Save it as parse.js, and run it on the console by entering "node parse.js".

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
adriano72
  • 399
  • 4
  • 9
21

Whitequark responded nicely. But with the current versions of Node.js and Express.js it requires one more line. Make sure to add the 'require http' (second line). I've posted a fuller example here that shows how this call can work. Once running, type http://localhost:8080/?name=abel&fruit=apple in your browser, and you will get a cool response based on the code.

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'));
})
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
james d'angelo
  • 319
  • 2
  • 4
16

It is so simple:

Example URL:

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

You can print all the values of query string by using:

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

Output

All query strings : { "id":"3","activatekey":"$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjz fUrqLrgS3zXJVfVRK"}

To print specific:

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

Output

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

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Saran Pal
  • 533
  • 5
  • 9
14

You can use

request.query.<varible-name>;
Yash Bele
  • 526
  • 5
  • 7
13

You can use with express ^4.15.4:

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

Hope this helps.

Harsh Patel
  • 4,208
  • 6
  • 24
  • 55
ajafik
  • 149
  • 1
  • 5
7
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

You can use this or you can try body-parser for parsing special element from the request parameters.

Nikita Popov
  • 329
  • 4
  • 13
Mehedi Abdullah
  • 476
  • 5
  • 7
7

In express.js you can get it pretty easy, all you need to do in your controller function is:

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

And that's all, assuming you are using es6 syntax.

PD. {id} stands for Object destructuring, a new es6 feature.

Kevin Alemán
  • 349
  • 4
  • 13
1

So, there are two ways in which this "id" can be received: 1) using params: the code params will look something like : Say we have an array,

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

Then for params we can do something like:

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

2) Another method is to use query parameters. so the url will look something like ".....\api\xyz?id=1" where "?id=1" is the query part. In this case we can do something like:

app.get('/api/posts',(req,res)=>{
    const course = courses.find(o=>o.id == (req.query.id))
    res.send(course);
});
abcbc
  • 83
  • 1
  • 11
1

There are many answers here regarding accessing the query using request.query however, none have mentioned its type quirk. The query string type can be either a string or an array, and this type is controlled by the user.

For instance using the following code:

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

app.get("/", function (req, res) {
  res.send(`Your name is ${(req.query.name || "").length} characters long`);
});

app.listen(3000);

Requesting /?name=bob will return Your name is 3 characters long but requesting /?name=bob&name=jane will return Your name is 2 characters long because the parameter is now an array ['bob', 'jane'].

Express offers 2 query parsers: simple and extended, both will give you either a string or an array. Rather than checking a method for possible side effects or validating types, I personally think you should override the parser to have a consistent type: all arrays or all strings.

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

const querystring = require("querystring");

// if asArray=false only the first item with the same name will be returned
// if asArray=true all items will be returned as an array (even if they are a single item)
const asArray = false;
app.set("query parser", (qs) => {
  const parsed = querystring.parse(qs);
  return Object.entries(parsed).reduce((previous, [key, value]) => {
    const isArray = Array.isArray(value);
    if (!asArray && isArray) {
      value = value[0];
    } else if (asArray && !isArray) {
      value = [value];
    }

    previous[key] = value;
    return previous;
  }, {});
});

app.get("/", function (req, res) {
  res.send(`Your name is ${(req.query.name || "").length} characters long`);
});

app.listen(3000);
Luke
  • 2,043
  • 1
  • 13
  • 12
0

you can use url module to collect parameters by using url.parse

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

In expressjs it's done by,

var id = req.query.id;

Eg:

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
  • 4,115
  • 1
  • 32
  • 30
0

If you ever need to send GET request to an IP as well as a Domain (Other answers did not mention you can specify a port variable), you can make use of this function:

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

Don't miss requiring modules at the top of your file:

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

Also bare in mind that you may use https module for communicating over secured domains and ssl. so these two lines would change:

https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......
AmiNadimi
  • 3,488
  • 1
  • 30
  • 46
0

In case you want to avoid express, use this example:

var http = require('http');
const url = require('url');

function func111(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  var q = url.parse(req.url, true);
  res.end("9999999>>> " + q.query['user_name']); 
}

http.createServer(func111).listen(3000); 

usage:

curl http://localhost:3000?user_name=user1

by yl

ylev
  • 1,535
  • 1
  • 15
  • 13
-2

I am using MEANJS 0.6.0 with express@4.16, it's good

Client:

Controller:

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

services:

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

Server

routes

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

controller

exports.order = function (req, res) {
  var keyword = req.query.keyword
  ...
Tính Ngô Quang
  • 3,020
  • 28
  • 29