How to Connect MongoDB to Node.js Using Mongoose
Mongoose.js connects your MongoDB clusters or collections with your Node.js app. It enables you to create schemas for your documents. Mongoose provides a lot of functionality when creating and working with schemas. <!--more--> In this tutorial we will look at how to connect a MongoDB instance with a Node.js application.
How to Connect MongoDB to Node.js Using Mongoose
MongoDB is one of the most widely used No-SQL databases in the developer world today. No-SQL databases allow developers to send and retrieve data as JSON documents, instead of SQL objects. To work with MongoDB in a Node.js app, we can use Mongoose.
Prerequisites
Before we move on, you'll need to have the following:
- Node.js installed on your machine.
- A MongoDB instance running on your machine. You won't need this if you want to use MongoDB Atlas.
- Some knowledge of Node.js and Express.js.
Step 1 - Installing Mongoose on a Node.js environment
Create and navigate to a new folder by running the following commands on a terminal.
$ mkdir mongoose_tutorial
$ cd mongoose_tutorial
Then install Express and Mongoose by executing the following command on a terminal.
$ npm install express mongoose --save
If you are using Yarn, run:
$ yarn add express mongoose
Step 2 -- Creating the connection
Create a new file server.js
to start our Express.js server. Load mongoose
and express
by adding the following code to server.js
.
server.js
const express = require("express");
const mongoose = require("mongoose");
const Router = require("./routes")
const app = express();
app.use(express.json());
Then connect to a local MongoDB instance using the mongoose.connect()
function.
server.js
mongoose.connect('mongodb://localhost:27017/usersdb',
{
useNewUrlParser: true,
useFindAndModify: false,
useUnifiedTopology: true
}
);
We pass the useNewUrlParser: true
, etc. to mongoose.connect()
to avoid the DeprecationWarning
.
To create a connection to MongoDB Atlas, follow the next steps.
- Open your Cluster tab in MongoDb Atlas and click
CONNECT
.
- Select
Connect your application
and choose Node.js for the driver. - Copy the connection string.
With the connection at hand, create the following variables and replace their values using your actual credentials.
server.js
const username = "<mongodb username>";
const password = "<password>";
const cluster = "<cluster name>";
const dbname = "myFirstDatabase";
mongoose.connect(
`mongodb+srv://${username}:${password}@${cluster}.mongodb.net/${dbname}?retryWrites=true&w=majority`,
{
useNewUrlParser: true,
useFindAndModify: false,
useUnifiedTopology: true
}
);
It's important to note that the cluster variable is the values appearing between the
@
and.mongodb.net
. In my case the cluster variable iscluster0.vte2d
.
To make sure your connection was successful, add the following code right below your mongoose.connect()
.
server.js
// ...
const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error: "));
db.once("open", function () {
console.log("Connected successfully");
});
Then, set the app to listen to port 3000.
server.js
// ...
app.use(Router);
app.listen(3000, () => {
console.log("Server is running at port 3000");
});
We will create the Router
later.
Step 3 -- Creating the schema
Now let's define a collection schema for our application.
Create another file models.js
and add the following code.
models.js
const mongoose = require("mongoose");
const UserSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
age: {
type: Number,
default: 0,
},
});
const User = mongoose.model("User", UserSchema);
module.exports = User;
We create a schema UserSchema
using the mongoose.Schema()
method. The schema collects the name
and age
fields sent from the request.
We then export the schema using the last 2 lines.
Step 4 -- Creating the POST endpoint
Create a new file routes.js
. This file defines the endpoints for our app.
Load express
and the schema we created in Step 3 by adding the following code.
routes.js
const express = require("express");
const userModel = require("./models");
const app = express();
Then create the POST endpoint by adding the following code.
routes.js
// ...
app.post("/add_user", async (request, response) => {
const user = new userModel(request.body);
try {
await user.save();
response.send(user);
} catch (error) {
response.status(500).send(error);
}
});
We create a route /add_user
to add a new user to the database. We parse the content to be saved to the database using the line const user = new userModel(request.body);
.
We then use a try/catch
block to save the object to the database using the .save()
method.
Step 5 -- Creating the GET endpoint
Add the following lines of code to the routes.js
file.
routes.js
// ...
app.get("/users", async (request, response) => {
const users = await userModel.find({});
try {
response.send(users);
} catch (error) {
response.status(500).send(error);
}
});
We create a route /users
to retrieve all the users saved using the /add_user
route. We collect these users from the database using the .find()
method. We then use a try/catch
block to 'send' the users to this endpoint.
Finally, export these endpoints by adding the line below.
routes.js
// ...
module.exports = app;
At this point, your application is ready. Serve the app by running the command below.
$ node server.js
Step 6 -- Testing the endpoints
Now, let's test the two endpoints we created above.
Open Postman and make a POST
request to the http://localhost:3000/add_user
endpoint.
A new user
is added to the database. You can check your collections to confirm this.
Make a GET
request to the http://localhost:3000/users
endpoint.
The endpoint returns a list of all the users
added to the database.
Conclusion
In this tutorial, we have looked at how to set up Mongoose. We have also looked at how to establish a database connection and how to create a schema for our collections. Mongoose can be used to connect to both MongoDB and MongoDB Atlas to your Node.js app.
I hope you found this article helpful.
Happy coding!
Peer Review Contributions by: Adrian Murage