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! ⚡️
