Dung (Donny) Nguyen

Senior Software Engineer

Parsing Request Parameters in a Controller Method

In Adonis.js, you can parse request parameters in a controller method using the request object provided by the framework. The request object gives you access to various methods to retrieve parameters from the URL, query string, or request body. Here’s how you can do it:

1. Accessing Route Parameters

If your route contains dynamic segments (e.g., /users/:id), you can access them using request.params() or directly via the params property in the controller method.

Example Route

Route.get('/users/:id', 'UserController.show')

Controller Method

class UserController {
  async show({ params }) {
    const userId = params.id // Access the 'id' parameter
    console.log(userId)
    return `User ID: ${userId}`
  }
}

Here, params.id retrieves the value of the id segment from the URL (e.g., /users/123123).


2. Accessing Query Parameters

Query parameters (e.g., /users?name=John) can be accessed using request.input() or request.get().

Example URL

GET /users?name=John&age=25

Controller Method

class UserController {
  async index({ request }) {
    const name = request.input('name') // Get 'name' query param
    const age = request.input('age')   // Get 'age' query param
    console.log(name, age)
    return `Name: ${name}, Age: ${age}`
  }
}

Using request.get()

class UserController {
  async index({ request }) {
    const queryParams = request.get() // Get all query params
    console.log(queryParams) // { name: 'John', age: '25' }
    return queryParams
  }
}

3. Accessing Request Body (POST/PUT Requests)

For parsing data from the request body (e.g., in a POST request), you can use request.body() or request.all().

Example Route

Route.post('/users', 'UserController.store')

Controller Method

class UserController {
  async store({ request }) {
    const data = request.all() // Get all fields from the request body
    console.log(data)
    return data
  }
}

If you send a JSON payload like:

{
  "name": "John",
  "email": "john@example.com"
}

request.all() will return { name: 'John', email: 'john@example.com' }.

You can also access specific fields:

const name = request.input('name') // Get 'name' from body

4. Using Type Validation (Optional)

Adonis.js provides a powerful validator to ensure the request params/body meet your requirements. You can use it in the controller like this:

Example with Validation

const { validate } = use('Validator')

class UserController {
  async store({ request, response }) {
    const rules = {
      name: 'required|string',
      email: 'required|email|unique:users',
    }

    const validation = await validate(request.all(), rules)

    if (validation.fails()) {
      return response.status(400).send(validation.messages())
    }

    const data = request.only(['name', 'email']) // Extract only specific fields
    console.log(data)
    return data
  }
}

Summary of Methods