Connect to MongoDB in NextJS with Mongoose
In this article, we will show you how to set up your database connection to MongoDB with a NextJS application.
Install Mongoose
We will be using Mongoose, which is an Object Data Modeling tool for MongoDB, which makes working with MongoDB really simple.
First, make sure you install it:
npm install mongoose
Creating a Database Connection Utility
Mongoose will create a global object that will let you connect to MongoDB if the connection exists.
To connect to the database, you have to do a check to make sure there isn't already a connection open:
import mongoose from "mongoose"; export const db = async () => { // I like to throw an error if the app doesn't get the right env variables if (!process.env.MONGODB_URI) { throw new Error("MONGODB_URI not provided"); } try { // If readyState === 0 then there is no connection if (mongoose.connection.readyState === 0) { await mongoose.connect(process.env.MONGODB_URI); console.log("Connected to DB"); } } catch (error) { console.log(error); } };
This snippet checks to see if the readyState === 0
, which would indicate there is no connection. We can then connect/reconnect to the database.
Create a Data Model
So our example is complete, let's create a simple User
model so we can test our connection:
// models/user.js import mongoose from "mongoose"; const urlSchema = new mongoose.Schema( { name: String, title: String ); // This OR checks if the model has already been created rather than created each time. export const Url = mongoose.models.Url || mongoose.model("Url", urlSchema);
Using the Database Connection
In this example, we will create a simple API, route.js
in our app
folder. This API route will create a new user
when you POST
the data:
// app/user/route.js import { NextResponse } from "next/server"; import { db } from "@/lib/db"; import { User } from "@/models/user"; import mongoose from "mongoose"; export async function POST(req) { try { // Incoming request contains the name and title const { name, title } = await req.json(); await db(); // 👈 Connect to the database here const response = await User.create({ name, title }); const { name, title } = response; return NextResponse.json({ name, title }, { status: 201 }); } catch { return NextResponse.json( { error: "Internal Server Error" }, { status: 500 } ); } }
And just like that, we are able to use our database! 🪄
Happy coding! ⚡️