📖 Scenario: You are building a simple NestJS backend application that needs to connect to a database using Prisma ORM. Prisma helps you manage your database easily with type-safe queries.In this project, you will set up Prisma in a NestJS project step-by-step, so your app can talk to the database.
🎯 Goal: Set up Prisma in a NestJS project by creating the Prisma service, configuring the Prisma module, and integrating it into the main app module.After completing, your NestJS app will be ready to use Prisma for database operations.
📋 What You'll Learn
Create a PrismaService class that extends PrismaClient
Add a configuration variable for Prisma logging
Create a PrismaModule that provides PrismaService
Import PrismaModule into the main AppModule
💡 Why This Matters
🌍 Real World
Setting up Prisma in NestJS is a common task when building backend APIs that need to interact with databases safely and efficiently.
💼 Career
Many companies use NestJS with Prisma for scalable backend development. Knowing this setup is valuable for backend developer roles.
Progress0 / 4 steps
1
Create PrismaService class
Create a class called PrismaService that extends PrismaClient from @prisma/client. Inside the constructor, call super() to initialize the client.
NestJS
Hint
Think of PrismaService as a helper that talks to the database. Extending PrismaClient gives it all the database powers.
2
Add Prisma logging configuration
Inside the PrismaService constructor, add a configuration object to super() with a log property set to ["query", "error", "warn"] to enable logging of queries, errors, and warnings.
NestJS
Hint
Logging helps you see what Prisma is doing behind the scenes. Pass the log array inside super().
3
Create PrismaModule to provide PrismaService
Create a NestJS module called PrismaModule using @Module decorator from @nestjs/common. Inside @Module, add providers and exports arrays both containing PrismaService.
NestJS
Hint
Modules group related providers. Exporting PrismaService lets other modules use it.
4
Import PrismaModule into AppModule
In the main AppModule, import PrismaModule inside the imports array of the @Module decorator from @nestjs/common.
NestJS
Hint
Importing PrismaModule makes PrismaService available app-wide.
Practice
(1/5)
1. What is the main purpose of PrismaService in a NestJS application?
easy
A. To provide a reusable database client instance for querying the database
B. To handle HTTP requests and responses
C. To define the database schema
D. To manage application configuration settings
Solution
Step 1: Understand PrismaService role
PrismaService wraps the Prisma Client to provide a single database connection instance across the app.
Step 2: Differentiate from other roles
It does not handle HTTP or define schema; those are handled by controllers and Prisma schema files respectively.
Final Answer:
To provide a reusable database client instance for querying the database -> Option A
Quick Check:
PrismaService = database client provider [OK]
Hint: PrismaService is your database helper in NestJS [OK]
Common Mistakes:
Confusing PrismaService with controllers
Thinking PrismaService defines schema
Assuming PrismaService manages config
2. Which of the following is the correct way to import and provide PrismaService in a NestJS module?
easy
A. import { PrismaService } from '@nestjs/common';
@Module({ controllers: [PrismaService] })
B. import { PrismaService } from './prisma.service';
@Module({ providers: [PrismaService], exports: [PrismaService] })
C. import PrismaService from 'prisma';
@Module({ providers: [PrismaService] })
D. import { PrismaService } from './prisma.service';
@Module({ imports: [PrismaService] })
Solution
Step 1: Check import source
PrismaService is a custom service, so it must be imported from its local file, not from '@nestjs/common' or external packages.
Step 2: Verify module metadata
It should be listed under providers and exports to be injectable and reusable in other modules.
Final Answer:
import { PrismaService } from './prisma.service';
@Module({ providers: [PrismaService], exports: [PrismaService] }) -> Option B
Quick Check:
Local import + providers and exports = correct setup [OK]
Hint: PrismaService is a provider, import locally and add to providers [OK]
Common Mistakes:
Importing PrismaService from wrong package
Adding PrismaService to controllers instead of providers
Using imports array instead of providers
3. Given this PrismaService method in NestJS, what will console.log(user) output if the user with ID 1 exists?
async getUserById(id: number) {
return this.prisma.user.findUnique({ where: { id } });
}
const user = await prismaService.getUserById(1);
console.log(user);
medium
A. A syntax error because findUnique is not a function
B. An array of all users in the database
C. An object containing the user's data with ID 1
D. null, because findUnique returns nothing
Solution
Step 1: Understand findUnique behavior
findUnique returns a single record matching the unique filter or null if none found.
Step 2: Given user with ID 1 exists
The method returns the user object with ID 1, so console.log prints that object.
Final Answer:
An object containing the user's data with ID 1 -> Option C
Quick Check:
findUnique returns single object or null [OK]
Hint: findUnique returns one object or null, not array [OK]
Common Mistakes:
Thinking findUnique returns an array
Assuming it always returns null
Confusing findUnique with findMany
4. You wrote this PrismaService method but get a runtime error: Cannot read property 'user' of undefined. What is the likely cause?
Hint: Initialize prisma client in constructor to avoid undefined errors [OK]
Common Mistakes:
Forgetting to instantiate PrismaClient in PrismaService
Assuming findMany needs parameters
Thinking method must be static
5. You want to create a NestJS service method that fetches all posts with their authors using Prisma. Which code snippet correctly uses Prisma to fetch posts including author data?
hard
A. return this.prisma.post.findMany({ where: { author: true } });
B. return this.prisma.post.findMany({ select: { authorId: true } });