How to Connect Nextjs With Database

How to Connect Next.js With Database Introduction Next.js is a powerful React framework that enables developers to build server-rendered web applications with ease. One of the key aspects of building dynamic applications is the ability to connect your frontend to a database. This connection allows you to store, retrieve, and manage data efficiently, powering features such as user authentication, c

Nov 17, 2025 - 11:36
Nov 17, 2025 - 11:36
 3

How to Connect Next.js With Database

Introduction

Next.js is a powerful React framework that enables developers to build server-rendered web applications with ease. One of the key aspects of building dynamic applications is the ability to connect your frontend to a database. This connection allows you to store, retrieve, and manage data efficiently, powering features such as user authentication, content management, and real-time updates.

Connecting Next.js with a database is essential for creating scalable, data-driven applications. It bridges the gap between client-side UI and backend data logic, enabling you to build full-stack applications with a seamless user experience. Whether you are working with SQL databases like PostgreSQL or NoSQL databases like MongoDB, Next.js provides flexible options to integrate with your database of choice.

Step-by-Step Guide

1. Choose Your Database

Before connecting Next.js to a database, you need to decide on the type of database that best suits your project requirements:

  • Relational Databases: PostgreSQL, MySQL, SQLite
  • NoSQL Databases: MongoDB, Firebase, DynamoDB

Each database type serves different needs, such as complex queries (SQL) or flexible schema design (NoSQL).

2. Set Up Your Database

Once you've chosen a database, set it up either locally or using a cloud provider:

  • Install the database software or create an account with a managed service.
  • Create a new database instance and configure basic settings like user roles and access permissions.
  • Note connection credentials such as host, port, username, password, and database name.

3. Initialize Your Next.js Project

If you haven't already, create a new Next.js project:

npx create-next-app@latest my-nextjs-app

cd my-nextjs-app

This command sets up the basic Next.js boilerplate to get you started quickly.

4. Install Database Client Libraries

Next, install the appropriate database client libraries or ORM (Object-Relational Mapper) to interact with your database. Examples include:

  • PostgreSQL: pg or Prisma
  • MySQL: mysql2 or Prisma
  • MongoDB: mongodb or Mongoose

For example, to install Prisma and PostgreSQL client:

npm install @prisma/client

npm install prisma --save-dev

5. Configure Environment Variables

Store your database credentials securely using environment variables. Create a .env.local file in the root of your project:

DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase"

Next.js automatically loads variables from this file, keeping sensitive data out of your codebase.

6. Set Up Database Connection

Depending on your choice of client or ORM, establish the connection within your Next.js project. For example, with Prisma:

  • Initialize Prisma schema with npx prisma init.
  • Define your data models inside prisma/schema.prisma.
  • Run migrations to create tables: npx prisma migrate dev --name init.
  • Create a Prisma client instance in a utility file, e.g., lib/prisma.js:
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

export default prisma;

7. Create API Routes for Database Operations

Next.js API routes allow you to create server-side endpoints that can interact with your database. Create a file under pages/api such as users.js:

import prisma from '../../lib/prisma';

export default async function handler(req, res) {

if (req.method === 'GET') {

const users = await prisma.user.findMany();

res.status(200).json(users);

} else if (req.method === 'POST') {

const { name, email } = req.body;

const newUser = await prisma.user.create({

data: { name, email },

});

res.status(201).json(newUser);

} else {

res.setHeader('Allow', ['GET', 'POST']);

res.status(405).end(Method ${req.method} Not Allowed);

}

}

This API route handles GET and POST requests to fetch and create users.

8. Connect Frontend to API

Use Next.js pages or components to fetch data from your API routes. Here's an example using fetch in a React component:

import { useState, useEffect } from 'react';

export default function UsersList() {

const [users, setUsers] = useState([]);

useEffect(() => {

fetch('/api/users')

.then((res) => res.json())

.then((data) => setUsers(data));

}, []);

return (

<div>

<h2>Users</h2>

<ul>

{users.map((user) => (

<li key={user.id}>{user.name} ({user.email})</li>

))}

</ul>

</div>

);

}

9. Test Your Database Connection

Run your Next.js application:

npm run dev

Visit your pages and API endpoints to verify that data is being fetched and stored correctly.

Best Practices

Use Environment Variables

Always keep sensitive database credentials in environment variables rather than hardcoding them. This improves security and makes your app easier to configure across environments.

Implement Connection Pooling

Use connection pooling libraries or ORM features to manage efficient database connections, especially under high traffic.

Handle Errors Gracefully

Implement proper error handling in your API routes and frontend code to provide useful feedback and maintain app stability.

Secure Your API Endpoints

Use authentication and authorization to restrict access to sensitive database operations.

Optimize Queries

Write optimized queries and use indexes in your database to improve performance.

Use TypeScript for Type Safety

If possible, leverage TypeScript in your Next.js project to catch errors early and improve maintainability.

Tools and Resources

Database Clients and ORMs

  • Prisma: Modern ORM for Node.js and TypeScript
  • Mongoose: MongoDB object modeling for Node.js
  • Sequelize: Promise-based Node.js ORM for SQL databases
  • TypeORM: TypeScript ORM supporting multiple databases

Databases

  • PostgreSQL: Open-source object-relational database
  • MySQL: Widely used open-source relational database
  • MongoDB: Document-oriented NoSQL database
  • Firebase Firestore: Serverless NoSQL database by Google

Hosting and Deployment

  • Vercel: Ideal platform for deploying Next.js apps
  • Heroku: Easy cloud platform for hosting databases and apps
  • AWS RDS: Managed relational database service
  • MongoDB Atlas: Cloud-hosted MongoDB database

Learning Resources

Real Examples

Example 1: Connecting Next.js to MongoDB with Mongoose

This example demonstrates a simple connection to MongoDB using Mongoose inside a Next.js API route.

import mongoose from 'mongoose';

const MONGODB_URI = process.env.MONGODB_URI;

if (!MONGODB_URI) {

throw new Error('Please define the MONGODB_URI environment variable inside .env.local');

}

let cached = global.mongoose;

if (!cached) {

cached = global.mongoose = { conn: null, promise: null };

}

async function connectToDatabase() {

if (cached.conn) {

return cached.conn;

}

if (!cached.promise) {

cached.promise = mongoose.connect(MONGODB_URI).then((mongoose) => {

return mongoose;

});

}

cached.conn = await cached.promise;

return cached.conn;

}

export default async function handler(req, res) {

await connectToDatabase();

const Cat = mongoose.models.Cat || mongoose.model('Cat', { name: String });

if (req.method === 'POST') {

const cat = new Cat({ name: req.body.name });

await cat.save();

res.status(201).json(cat);

} else if (req.method === 'GET') {

const cats = await Cat.find({});

res.status(200).json(cats);

} else {

res.status(405).end();

}

}

Example 2: Using Prisma with PostgreSQL in Next.js

This example shows a minimal API route that fetches all records from a Post table using Prisma.

import prisma from '../../lib/prisma';

export default async function handler(req, res) {

if (req.method === 'GET') {

const posts = await prisma.post.findMany();

res.status(200).json(posts);

} else {

res.status(405).json({ message: 'Method not allowed' });

}

}

FAQs

Can I use any database with Next.js?

Yes, Next.js is database-agnostic and supports connecting to any database that has a Node.js client or ORM. Choose the database that best fits your needs and use appropriate tools to integrate it.

Where should I put database connection code in Next.js?

Database connection logic is typically placed in utility files inside the lib or utils directory and imported into your API routes or server-side functions.

Is it safe to connect to the database directly from client-side code?

No. Database connections should only be made server-side (such as in API routes) to protect credentials and prevent unauthorized access.

How do I secure my database credentials?

Use environment variables and never commit credentials to version control. Use secrets management tools provided by your hosting platform when deploying.

Can I use Next.js API routes for production-grade backend logic?

Yes, Next.js API routes are suitable for many backend use cases, but for complex or high-scale applications, consider using a dedicated backend service or microservices architecture.

Conclusion

Connecting Next.js with a database is a fundamental skill for building dynamic, data-driven web applications. By choosing the right database, setting up secure connections, and leveraging Next.js API routes, you can create robust full-stack applications with ease. Whether you use relational databases like PostgreSQL or NoSQL options like MongoDB, Next.js provides flexible ways to integrate server-side data fetching and manipulation.

Following best practices such as environment variable management, error handling, and query optimization will ensure your application is secure, performant, and scalable. Utilize popular tools like Prisma or Mongoose to simplify database interactions and accelerate development. With the right setup, Next.js becomes a powerful tool to build modern web apps that seamlessly connect frontend and backend data.