Skip to main content

Command Palette

Search for a command to run...

URL Parameters vs Query Strings in Express.js

Understanding the real difference between params and query strings in Express.js APIs.

Published
•5 min read
URL Parameters vs Query Strings in Express.js
G
I enjoy blending technology with business to build solutions that create real impact. I’m fascinated by how technology empowers people, businesses, and startups. I believe thoughtful use of technology quietly improves lives, and that belief fuels everything I build and explore 💻.

If you’ve started working with Express.js recently, chances are you’ve already seen URLs containing things like IDs, search filters, page numbers, categories, or query values. Initially, all of these URLs may look similar because they are simply part of the request URL. But while building APIs, understanding the difference between URL parameters and query strings becomes extremely important because both are used for different purposes.
A lot of beginners confuse these two concepts because both involve passing data through the URL itself. But once the purpose behind each one becomes clear, deciding when to use params and when to use query strings becomes very straightforward. In this blog, we’ll understand what URL parameters are, what query strings are, how both differ from each other, how to access them in Express.js, and when each one should actually be used in real backend applications.

What URL Parameters Actually Are

URL parameters are dynamic values present directly inside the route path. They are mainly used to identify a specific resource. For example:

/users/101

Here, 101 is usually representing a specific user ID.

Similarly:

/products/55

Here, 55 may represent a specific product. In Express.js, URL parameters are defined using a colon (:). Example:

app.get("/users/:id", (req, res) => {
  res.send("User Route");
});

Here, :id becomes a route parameter.

Accessing URL Parameters in Express.js

Express provides all route parameters inside req.params. Example:

app.get("/users/:id", (req, res) => {
  console.log(req.params);

  res.send("User fetched");
});

If the request URL is:

/users/101

Output:

{ id: '101' }

You can directly access the value like this:

req.params.id

This is one of the most common patterns used in APIs while fetching specific users, products, posts, orders, or resources from databases. Whenever the value is directly identifying one particular resource, route parameters are usually the better choice because the route itself depends on that value for fetching the correct data.

What Query Parameters Are

Query parameters are different. Instead of being part of the route path itself, query strings appear after a question mark (?) in the URL. They are mainly used for filtering, sorting, searching, pagination, or modifying results. Example:

/products?category=mobile

Here, category=mobile is a query parameter.

Another example:

/products?category=mobile&price=low

Here, multiple query parameters are being passed together. Unlike route parameters, query strings usually do not identify a single specific resource. Instead, they modify how the data should be returned from the server.

Accessing Query Strings in Express.js

Express provides query parameters inside req.query. Example:

app.get("/products", (req, res) => {
  console.log(req.query);

  res.send("Products fetched");
});

If the request URL is:

/products?category=mobile&price=low

Output:

{
  category: 'mobile',
  price: 'low'
}

You can directly access values like this:

req.query.category
req.query.price

This is commonly used in APIs for search filters, sorting options, page numbers, and result customization. Most modern APIs heavily use query parameters whenever users need filtered or customized responses from the server.

Understanding the Core Difference

This is the main thing beginners should properly understand. URL parameters are generally used when the value is required to identify a specific resource. For example:

/users/101

Here, the route itself depends on the user ID because the server needs to know exactly which user is being requested.

On the other hand, query strings are generally optional modifiers or filters. For example:

/products?category=mobile

Here, the route still remains /products. The query parameter is simply modifying or filtering the response. That is the biggest conceptual difference between params and query strings in Express.js applications.

Practical Examples

Suppose you are building a social media backend. Fetching a specific user profile:

/users/101

This should usually use route parameters because the ID identifies one particular user.

Now suppose you are searching posts:

/posts?tag=nodejs

This should usually use query parameters because the tag is filtering results, not identifying one exact resource. Similarly, pagination, sorting, filtering, and searching are usually handled through query strings because they modify the returned data rather than uniquely identifying something.

Combining Params and Query Strings Together

Both can also be used together in real applications. Example:

/users/101/posts?page=2

Here:

  • 101 is a route parameter

  • page=2 is a query parameter

In Express:

app.get("/users/:id/posts", (req, res) => {
  console.log(req.params.id);
  console.log(req.query.page);

  res.send("Posts fetched");
});

Possible output:

101
2

This type of structure is very common in real-world REST APIs because it allows APIs to identify resources while also customizing or paginating the response at the same time.

When Should You Use Params vs Query?

A very simple way to decide is this. Use route parameters when the value is necessary to identify a specific resource. Use query parameters when the value modifies, filters, searches, sorts, or customizes the response.

For example:

/products/55

Specific product identification.

Whereas:

/products?sort=price

Sorting or filtering products. Once this distinction becomes clear, designing cleaner APIs becomes much easier because the URL structure starts naturally making more sense.

Common Beginner Mistake

One very common beginner mistake is trying to use query parameters for everything. For example:

/users?id=101

While this technically works, most REST API conventions prefer:

/users/101

because the user ID directly identifies a specific resource. Using proper URL structure improves API readability and makes routes easier to understand, maintain, and scale later in larger applications.

Final Thoughts

URL parameters and query strings may initially look very similar because both pass data through the URL, but their purposes are actually quite different. Route parameters are mainly used for identifying resources, whereas query parameters are used for filtering, searching, sorting, pagination, or modifying responses.

Once this distinction becomes clear, designing clean REST APIs in Express.js becomes much easier because you’ll naturally know which type of data belongs in the route path and which belongs inside query strings.