How to get GET (query string) variables in Express.js on Node.js?

Viewed 1659853

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?

26 Answers

Express specific simple ways to fetch

  1. query strings(after ?) such as https://...?user=abc&id=123

     var express = require('express');
    
     var app = express();
    
     app.get('/', function(req, res){
         res.send('id: ' + req.query.id);
     });
    
     app.listen(3000);
    
  2. query params such as https://.../get/users/:id

     var express = require('express');
     var app = express();
    
     app.get('/get/users/:id', function(req, res){
         res.send('id: ' + req.params.id);
     });
    
     app.listen(3000);
    
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.

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.

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

consider this url -> /api/endpoint/:id?name=sahil here id is param where as name is query. You can get this value in nodejs like this

app.get('/api/endpoint/:id', (req, res) => {
  const name = req.query.name; // query
  const id = req.params.id //params
});

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

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

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) => { ......

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

do like me

npm  query-string
import queryString from "query-string";

export interface QueryUrl {
  limit?: number;
  range?: string;
  page?: number;
  filed?: string;
  embody?: string;
  q?: string | object;
  order?: number;
  sort?: string;

}

 let parseUri: QueryUrl = queryString.parse(uri.query);

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
  ...
Related