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/123
→ 123
).
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}`
}
}
request.input('key')
: Retrieves a single query parameter by its key.request.get()
: Returns all query parameters as an object.
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
}
}
request.only(['key1', 'key2'])
: Extracts specific fields from the request body.- The validator ensures the data conforms to the defined
rules
.
Summary of Methods
params
: For route parameters (e.g.,:id
).request.input('key')
: For query params or body fields.request.get()
: For all query params.request.all()
: For all body fields.request.only(['key1', 'key2'])
: For specific fields from the body.