CRUD operations let you create, read, update, and delete data in your app. They are the basic actions to manage information.
CRUD operations in NestJS
import { Controller, Get, Post, Put, Delete, Body, Param } from '@nestjs/common'; @Controller('items') export class ItemsController { @Get() findAll() {} @Get(':id') findOne(@Param('id') id: string) {} @Post() create(@Body() createItemDto) {} @Put(':id') update(@Param('id') id: string, @Body() updateItemDto) {} @Delete(':id') remove(@Param('id') id: string) {} }
Use decorators like @Get, @Post, @Put, and @Delete to define HTTP methods.
@Param gets data from the URL, @Body gets data from the request body.
@Get()
findAll() {
return 'Return all items';
}@Post()
create(@Body() createItemDto) {
return `Create item with name: ${createItemDto.name}`;
}@Put(':id') update(@Param('id') id: string, @Body() updateItemDto) { return `Update item ${id} with name: ${updateItemDto.name}`; }
@Delete(':id') remove(@Param('id') id: string) { return `Delete item with id ${id}`; }
This controller manages a list of items in memory. You can add, get, update, and delete items by their ID.
import { Controller, Get, Post, Put, Delete, Body, Param } from '@nestjs/common'; interface Item { id: number; name: string; } @Controller('items') export class ItemsController { private items: Item[] = []; private idCounter = 1; @Get() findAll(): Item[] { return this.items; } @Get(':id') findOne(@Param('id') id: string): Item | string { const item = this.items.find(i => i.id === +id); return item || 'Item not found'; } @Post() create(@Body() createItemDto: { name: string }): Item { const newItem = { id: this.idCounter++, name: createItemDto.name }; this.items.push(newItem); return newItem; } @Put(':id') update(@Param('id') id: string, @Body() updateItemDto: { name: string }): Item | string { const item = this.items.find(i => i.id === +id); if (!item) return 'Item not found'; item.name = updateItemDto.name; return item; } @Delete(':id') remove(@Param('id') id: string): string { const index = this.items.findIndex(i => i.id === +id); if (index === -1) return 'Item not found'; this.items.splice(index, 1); return `Deleted item with id ${id}`; } }
In real apps, data usually comes from a database, not memory.
Use DTOs (Data Transfer Objects) to validate and type-check data.
Each HTTP method matches a CRUD action: GET=read, POST=create, PUT=update, DELETE=delete.
CRUD operations let you manage data by creating, reading, updating, and deleting.
In NestJS, use controllers with decorators like @Get, @Post, @Put, and @Delete.
Use @Param to get URL data and @Body to get data sent by the client.
Practice
Solution
Step 1: Understand HTTP methods and their NestJS decorators
HTTP POST is used to create new data. NestJS uses @Post decorator for this.Step 2: Match the decorator to the HTTP method
@Get is for reading, @Put for updating, and @Delete for deleting data, so they don't fit creating data.Final Answer:
@Post -> Option AQuick Check:
POST = @Post [OK]
- Confusing @Get with @Post
- Using @Put for creating data
- Using @Delete for creation
id in a NestJS controller method?Solution
Step 1: Identify the decorator for route parameters
@Param is used to extract parameters from the URL path, such as /items/:id.Step 2: Check other decorators and their uses
@Body extracts data from the request body, @Query from query strings, and @Headers from HTTP headers, so they don't get route params.Final Answer:
async getItem(@Param('id') id: string) {} -> Option CQuick Check:
Route param = @Param [OK]
- Using @Body to get URL params
- Using @Query for route params
- Confusing @Headers with @Param
/items/5 and the service deletes the item successfully?
@Delete(':id')
async remove(@Param('id') id: string) {
await this.itemsService.delete(id);
return { message: `Item ${id} deleted` };
}Solution
Step 1: Analyze the controller method's return value
The method returns an object with a message string including the id parameter.Step 2: Understand the response for successful deletion
Since the method returns a JSON object with the message, the client receives that JSON with HTTP 200 OK by default.Final Answer:
{ "message": "Item 5 deleted" } -> Option BQuick Check:
Return JSON message on success = { "message": "Item 5 deleted" } [OK]
- Expecting HTTP 204 No Content without explicit status
- Assuming error response without checking service
- Confusing DELETE with GET response
@Put(':id')
async update(@Body() updateDto: UpdateItemDto) {
return this.itemsService.update(updateDto.id, updateDto);
}Solution
Step 1: Check how the id is obtained
The method expects id from updateDto.id, but the route has ':id' parameter which is not extracted.Step 2: Identify missing @Param decorator
To get id from URL, @Param('id') id: string should be added as a parameter to the method.Final Answer:
Missing @Param decorator to get the id from URL -> Option DQuick Check:
URL param needs @Param [OK]
- Assuming id comes from body without @Param
- Confusing @Body with @Query
- Ignoring route parameters
id from the URL and new data from the request body. Which of the following method signatures correctly follows NestJS CRUD patterns?Solution
Step 1: Identify correct decorators for id and body
Use @Param('id') to get id from URL and @Body() to get update data object.Step 2: Check method parameters and service call
async update(@Param('id') id: string, @Body() updateDto: UpdateItemDto) { return this.itemsService.update(id, updateDto); } correctly separates id and updateDto and calls service with both.Final Answer:
async update(@Param('id') id: string, @Body() updateDto: UpdateItemDto) { return this.itemsService.update(id, updateDto); } -> Option AQuick Check:
Use @Param for id, @Body for data [OK]
- Using @Body('id') instead of @Param('id')
- Using @Query for route params
- Passing params object instead of separate arguments
Ready to prove it?
Pass the test and this pattern moves unknown
