Wisdom Ekpot A student of Ibom Metropolitan Polytechnic studying computer engineering, Wisdom has been writing JavaScript for two years, focusing on Vue.js, Angular, and Express.js.

Setting up MongoDB in Deno

3 min read 939

Setting up MongoDB in Deno

Deno is a simple and secure runtime for JavaScript that supports and configures TypeScript by default. MongoDB is a cross-platform document-oriented database program that is widely used by developers. In this article, we will learn how to integrate MongoDB into our Deno application.

Prerequisites

  • Familiarity with TypeScript
  • VS Code, or any code editor installed on your development machine.
  • Basic knowledge of MongoDB.
  • POSTMAN installed on local machine.

Before we start, make sure you have Deno installed on your local machine. If you’re using a Mac and you don’t yet have it installed, open up your terminal and run this command:

brew install deno

If you are using a Windows machine, you can install it by running this command on your terminal:

iwr https://deno.land/x/install/install.ps1 -useb | iex

Or, if you have Chocolatey installed, you could run:

choco install deno

Getting started

We will start by creating a server.js file and then set up our Deno server. Since there is no package.json file like we have in Node.js, Deno uses modules reference by URLs or file paths.

import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
const router = new Router();
const PORT = 3000;
router
  .get("/", (ctx) => {
    ctx.response.body = "This is the home route";
  });
app.use(router.routes());
app.use(router.allowedMethods());
app.listen({ port: PORT });

We are using Oak to run our server. Oak is a Deno middleware framework for HTTP servers, and it includes a router middleware as well.

We can now run deno run --allow-net server.ts on our terminal to serve our application. Due to Deno’s security, we need to add the --allow-net to run a server. We can look up the application on our browser on localhost:8000.

Now that our server is up and running, we can start setting up MongoDB in our application. Create a db.js file, which is where we will set up our DB config:

// import the package from url
import { init, MongoClient } from "https://deno.land/x/mongo@v0.12.1/mod.ts";
// Intialize the plugin
await init();
// Create client
const client = new MongoClient();
// Connect to mongodb
client.connectWithUri("mongodb://localhost:27017");
// Give your database a name
const dbname: string = "denoMongoApp";
const db = client.database(dbname);
// Declare the mongodb collections here. Here we are using only one collection (i.e user).
// Defining schema interface
interface UserSchema {
  _id: { $oid: string };
  name: string;
  email: string;
  phone: string;
}
const User = db.collection<UserSchema>("user");
export { db, User };

Here we import the plugin and then initialize it. We create an instance of the mongoClient and then connect it to MongoDB. We set up a User collection, which we’ll use to test our Mongo config. We also define a TypeScript interface for MongoDB model which will take a name, email, phone, and a generated Mongo ID.

Now that this is set up, we’ll build a simple CRUD application to test it. To make our application more scalable, we need to create a routes.ts and a controller.ts file. Our routes.ts file will handle our routes, and the controller.ts file will handle our MongoDB logic.

We made a custom demo for .
No really. Click here to check it out.

Our routes.ts file should look like this:

import { Router } from "https://deno.land/x/oak/mod.ts";
import { getUsers, createUser } from "./controller.ts";
const router = new Router();
router
  .get("/", (ctx) => {
    ctx.response.body = "This is the home route";
  })
  .get("/get-users", getUsers)
  .post("/create-user", createUser);
export default router;

With this new configuration, we need to modify our server.ts file to this:

import { Application } from "https://deno.land/x/oak/mod.ts";
const app = new Application();
import router from "./routes.ts";
const PORT: number = 3000;
//
app.use(router.routes());
app.use(router.allowedMethods());
app.listen({ port: PORT });

Now we need to define our route methods that we called in the router.ts file. We’ll start by creating the getUser method. Remember that we have to bring in the instance of our database that we created in the db.ts file:

import { User } from "./db.ts";

let getUsers = async (ctx: any) => {
  try {
    const data: any = await User.find();
    ctx.response.body = { "status": true, data: data };
    ctx.response.status = 200;
  } catch (err) {
    ctx.response.body = { status: false, data: null };
    ctx.response.status = 500;
    console.log(err);
  }
};

Now we can now call the get-user endpoint, which will return an empty array by default and a status of 200.

We’ll use the same technique to implement the createUser method:

let createUser = async (ctx: any) => {
  try {
    let body: any = await ctx.request.body();
    console.log(await body.value);
    const { name, phone, email } = await body.value;
    const id = await User.insertOne({
      name: name,
      phone: phone,
      email: email,
    });
    ctx.response.body = { status: true, data: id };
    ctx.response.status = 201;
  } catch (err) {
    ctx.response.body = { status: false, data: null };
    ctx.response.status = 500;
    console.log(err);
  }
};

Always remember to await body.value, as this is an asynchronous request. Without doing this, it will just return the object ID.

Let’s run the application:

deno run --allow-all --unstable server.ts

The --allow-all flag will allow all permissions and disable Deno’s security in our application.

Testing our endpoints

Let’s go ahead and test our endpoints using POSTMAN. Here’s the test for getting users:

POSTMAN Test for Getting Users

And here’s the test for creating a user:

POSTMAN Test for Creating a User

Conclusion

Setting up an application in Deno is quite easy and more secure. You can use any database of your choice as long as there is a Deno controller for it. Due to the fact that Deno doesn’t have a package.json file, it caches all the modules on our local machine, which is much faster.

: Full visibility into your web apps

LogRocket is a frontend application monitoring solution that lets you replay problems as if they happened in your own browser. Instead of guessing why errors happen, or asking users for screenshots and log dumps, LogRocket lets you replay the session to quickly understand what went wrong. It works perfectly with any app, regardless of framework, and has plugins to log additional context from Redux, Vuex, and @ngrx/store.

In addition to logging Redux actions and state, LogRocket records console logs, JavaScript errors, stacktraces, network requests/responses with headers + bodies, browser metadata, and custom logs. It also instruments the DOM to record the HTML and CSS on the page, recreating pixel-perfect videos of even the most complex single-page apps.

.
Wisdom Ekpot A student of Ibom Metropolitan Polytechnic studying computer engineering, Wisdom has been writing JavaScript for two years, focusing on Vue.js, Angular, and Express.js.

Leave a Reply