hapi — How to Use Query Parameters

During the last weeks we’ve kicked off a new hapi server, extended its functionality with plugins, wrote our own custom plugin, added authentication and defined those authentication strategies to apply for your routes within a selected hapi server instance.

As you’ve recognized within the title, this tutorial is geared towards the handling of query parameters and shows you how to manage them within your app.

Before diving into the details, have a look at the series outline and find posts that match your interests and needs.

hapi Series Overview

Access Query Parameters

Query parameters are a common way to pass information from clients to the server and of course you’re able to make use of query parameters in hapi, too. Let’s start out with a straight forward example based on the URL below:

https://futurestud.io?name=marcus  

Dividing the URL into its different parts will result in the query parameter string of ?name=marcus. Query parameters in URLs are in the format of key=value. The first query parameter pair is indicated within the URL by using the question mark ? and any following pair is added by using the ampersand &.

In hapi, you can access query parameters using the request object. The request instance provides a field called query and by accessing it, you’ll receive an object with the parsed query parameters from your request’s URL. The code snippet below shows you how to access query parameters within a route handler.

hapi v17

server.route({  
  method: 'GET',
  path: '/',
  handler: (request, h) => {
    // access request’s query parameter
    const params = request.query

    console.log(params)
  }
})

hapi v16

server.route({  
  method: 'GET',
  path: '/',
  handler: function (request, reply) {
    // access request’s query parameter
    var params = request.query

    console.log(params)

    reply()
  }
})

Based on the exemplary URL from the start of this section, the resulting query parameter object in hapi would look like this:

{
  name: 'marcus'
}

Because you’ve only provided a single parameter with key name and value marcus, the object contains just this single field. If you pass more parameters with different keys, each of them is available as an individual field. But what if we provide multiple query parameters with the same key? The following section shows you the details.

Multiple Query Parameters of the Same Name

You’ve seen how to access query parameters in hapi if you only provide a key once within your request URL. Let’s assume you’re using the following URL that specifies a name and two filter.

https://futurestud.io?name=marcus&filter=premium&filter=video  

In the process of extending the Future Studio Blog to the upcoming Future Studio University, we’ve added functionality that allows you to filter tutorials based on its type and content. Currently, we have videos available for selected guides, but you can’t filter for them. That will be different within the next major release of our platform (no release date yet, sorry).

You’ve already seen how to access query parameters, let’s recap it again:

hapi v17

server.route({  
  method: 'GET',
  path: '/',
  handler: (request, h) => {
    // access request’s query parameter
    var params = request.query

    console.log(params)
  }
})

hapi v16

server.route({  
  method: 'GET',
  path: '/',
  handler: function (request, reply) {
    // access request’s query parameter
    var params = request.query

    console.log(params)

    reply()
  }
})

Based on the sample URL in the beginning of this section, we’re expecting the query parameter object to have a field for name with value marcus and aren’t sure what happens to filter. Actually, you may have thought of a list with values and that’s exactly what hapi does and provides: a list of values for the key filter.

{
  name: 'marcus',
  filter: [
    'video',
    'premium'
  ]
}

Notice: please keep in mind that hapi provides the individual value for a given key if you only pass it once within the request URL. If you add the same key twice or more often, you’ll receive an array of values. Make sure your application is aware of this scenario and can handle it properly. Don’t let users crash your server by adding keys manually within the URL and you’re expecting just a single value but get caught up in an array.

Empty Query Parameter Values

There are various scenarios that can happen and your server received invalid or malformed data. But what happens if the value is missing for the query parameter key?

https://futurestud.io?name=&filter=video  

You’ll receive an empty string value for name.

{
  name: '',
  filter: 'video
}

Query Parameters After Trailing Slash in Base URL

Adding query parameters to our base URL that doesn’t contain a trailing slash, browsers will add the trailing slash automatically. The functionality stays the same and query parameters get send properly with your request and parsed by hapi.

The following request URLs are actually the same:

https://futurestud.io?name=marcus  
# and
https://futurestud.io/?name=marcus  

If you request a base URL without trailing slash and query parameters within your browser, it will automatically add it.

The evaluation of query parameters will stay the same for paths other than root and query parameters are valid for those URLs with trailing slash as well, like:

https://futurestud.io/blog/?filter=video  

The difference between base URL and URL paths is this: browsers won’t add the trailing slash after your path segment automatically.

Outlook

This guide walked you through the handling of query parameters in hapi. Actually, it’s kind of straight forward, because you’ll receive the individual values already parsed as a JavaScript Object. Please make sure that your app handles empty (undefined|null|{}), single and arrays of values properly. Be cautious about the input within your implementation and look that your server doesn’t crash due to the query parameter values.

To close the realm of request parameters, you should get a grasp on path parameter handling including multi-segment and wildcard params.

We appreciate feedback and love to help you if there’s a question on your mind. Let us know in the comments or on twitter @futurestud_io.

Make it rock & enjoy coding!

Explore the Library

Find interesting tutorials and solutions for your problems.