How to access the GET parameters after "?" in Express?

node.jsExpressQuery String

node.js Problem Overview


I know how to get the params for queries like this:

app.get('/sample/:id', routes.sample);

In this case, I can use req.params.id to get the parameter (e.g. 2 in /sample/2).

However, for url like /sample/2?color=red, how can I access the variable color?

I tried req.params.color but it didn't work.

node.js Solutions


Solution 1 - node.js

So, after checking out the express reference, I found that req.query.color would return me the value I'm looking for.

req.params refers to items with a ':' in the URL and req.query refers to items associated with the '?'

Example:

GET /something?color1=red&color2=blue

Then in express, the handler:

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})

Solution 2 - node.js

Use req.query, for getting he value in query string parameter in the route. Refer req.query. Say if in a route, http://localhost:3000/?name=satyam you want to get value for name parameter, then your 'Get' route handler will go like this :-

app.get('/', function(req, res){
	console.log(req.query.name);
	res.send('Response send to client::'+req.query.name);

});

Solution 3 - node.js

Update: req.param() is now deprecated, so going forward do not use this answer.


Your answer is the preferred way to do it, however I thought I'd point out that you can also access url, post, and route parameters all with req.param(parameterName, defaultValue).

In your case:

var color = req.param('color');

From the express guide:

> lookup is performed in the following order: > > * req.params > * req.body > * req.query

Note the guide does state the following:

> Direct access to req.body, req.params, and req.query should be > favoured for clarity - unless you truly accept input from each object.

However in practice I've actually found req.param() to be clear enough and makes certain types of refactoring easier.

Solution 4 - node.js

Query string and parameters are different.

You need to use both in single routing url

Please check below example may be useful for you.

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')

  ................

});

Get the link to pass your second segment is your id example: http://localhost:port/sample/123

If you facing problem please use Passing variables as query string using '?' operator

  app.get('/sample', function(req, res) {

     var id = req.query.id; 

      ................

    });

Get link your like this example: http://localhost:port/sample?id=123

Both in a single example

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')
 var id2 = req.query.id; 
  ................

});

Get link example: http://localhost:port/sample/123?id=123

Solution 5 - node.js

@Zugwait's answer is correct. req.param() is deprecated. You should use req.params, req.query or req.body.

But just to make it clearer:

req.params will be populated with only the route values. That is, if you have a route like /users/:id, you can access the id either in req.params.id or req.params['id'].

req.query and req.body will be populated with all params, regardless of whether or not they are in the route. Of course, parameters in the query string will be available in req.query and parameters in a post body will be available in req.body.

So, answering your questions, as color is not in the route, you should be able to get it using req.query.color or req.query['color'].

Solution 6 - node.js

The express manual says that you should use req.query to access the QueryString.

// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {
  
  var isSmall = req.query.size === 'small'; // > true
  // ...
  
});

Solution 7 - node.js

const express = require('express')
const bodyParser = require('body-parser')
const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js')

const app = express()
app.set('view engine', 'pug')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.get('/', (req, res) => {
  usersNdJobs()
    .then((users) => {
      res.render('users', { users })
    })
    .catch(console.error)
})

app.get('/api/company/users', (req, res) => {
  const companyname = req.query.companyName
  console.log(companyname)
  userByJob(companyname)
    .then((users) => {
      res.render('job', { users })
    }).catch(console.error)
})

app.post('/api/users/add', (req, res) => {
  const userName = req.body.userName
  const jobName = req.body.jobName
  console.log("user name = "+userName+", job name : "+jobName)
  addUser(userName, jobName)
    .then((result) => {
      res.status(200).json(result)
    })
    .catch((error) => {
      res.status(404).json({ 'message': error.toString() })
    })
})
app.post('/users/add', (request, response) => {
  const { userName, job } = request.body
  addTeam(userName, job)
  .then((user) => {
    response.status(200).json({
      "userName": user.name,
      "city": user.job
    })
  .catch((err) => {
    request.status(400).json({"message": err})
  })
})

app.post('/api/user/company/add', (req, res) => {
  const userName = req.body.userName
  const companyName = req.body.companyName
  console.log(userName, companyName)
  addUserToCompany(userName, companyName)
  .then((result) => {
    res.json(result)
  })
  .catch(console.error)
})

app.get('/api/company/user', (req, res) => {
 const companyname = req.query.companyName
 console.log(companyname)
 userByJob(companyname)
 .then((users) => {
   res.render('jobs', { users })
 })
})

app.listen(3000, () =>
  console.log('Example app listening on port 3000!')
)

Solution 8 - node.js

A nice technique i've started using with some of my apps on express is to create an object which merges the query, params, and body fields of express's request object.

//./express-data.js
const _ = require("lodash");

class ExpressData {

    /*
	* @param {Object} req - express request object
	*/
	constructor (req) {

		//Merge all data passed by the client in the request
		this.props = _.merge(req.body, req.params, req.query);
     }

}

module.exports = ExpressData;

Then in your controller body, or anywhere else in scope of the express request chain, you can use something like below:

//./some-controller.js

const ExpressData = require("./express-data.js");
const router = require("express").Router();


router.get("/:some_id", (req, res) => {

    let props = new ExpressData(req).props;

    //Given the request "/592363122?foo=bar&hello=world"
    //the below would log out 
    // {
    //   some_id: 592363122,
    //   foo: 'bar',
    //   hello: 'world'
    // }
    console.log(props);

    return res.json(props);
});

This makes it nice and handy to just "delve" into all of the "custom data" a user may have sent up with their request.

Note

Why the 'props' field? Because that was a cut-down snippet, I use this technique in a number of my APIs, I also store authentication / authorisation data onto this object, example below.

/*
 * @param {Object} req - Request response object
*/
class ExpressData {

	/*
	* @param {Object} req - express request object
	*/
	constructor (req) {

		//Merge all data passed by the client in the request
		this.props = _.merge(req.body, req.params, req.query);

		//Store reference to the user
		this.user = req.user || null;

		//API connected devices (Mobile app..) will send x-client header with requests, web context is implied.
        //This is used to determine how the user is connecting to the API 
		this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
	}
} 

Solution 9 - node.js

you can simply use req.query for get query parameter:

app.get('/', (req, res) => {
    let color1 = req.query.color1
    let color2 = req.query.color2
})

The url module provides utilities for URL resolution and parsing. URL parse without using Express:

const url = require('url');
const queryString = require('querystring');

let rawUrl = 'https://stackoverflow.com/?page=2&size=3';

let parsedUrl = url.parse(rawUrl);
let parse = queryString.parse(parsedUrl.query);

// parse = { page: '2', size: '3' }

Another way:

const url = require('url');

app.get('/', (req, res) => {
  const queryObject = url.parse(req.url,true).query;
});

url.parse(req.url,true).query returns { color1: 'red', color2: 'green' }.
url.parse(req.url,true).host returns 'localhost:8080'.
url.parse(req.url,true).search returns '?color1=red&color2=green'.

Solution 10 - node.js

Just use the app.get:

app.get('/some/page/here', (req, res) => {
    console.log(req.query.color) // Your color value will be displayed
})

You can see it on expressjs.com documentation api: http://expressjs.com/en/api.html

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHanfei SunView Question on Stackoverflow
Solution 1 - node.jsHanfei SunView Answer on Stackoverflow
Solution 2 - node.jssatyam kumarView Answer on Stackoverflow
Solution 3 - node.jsAaron SilvermanView Answer on Stackoverflow
Solution 4 - node.jsRaja Rama Mohan ThavalamView Answer on Stackoverflow
Solution 5 - node.jsAndre PenaView Answer on Stackoverflow
Solution 6 - node.jsJan BiasiView Answer on Stackoverflow
Solution 7 - node.jssemeView Answer on Stackoverflow
Solution 8 - node.jsLee BrindleyView Answer on Stackoverflow
Solution 9 - node.jsMD. RAKIB HASANView Answer on Stackoverflow
Solution 10 - node.jscyberfroggView Answer on Stackoverflow