Building API using DenoJs and Expressjs with Mongoose
Introduction
In this article we are going to build an API using denojs and expressjs, we will be using mongodb with mongoose. but before we continue let understand some terms
DenoJs : Is a JavaScript, TypeScript, and WebAssembly runtime with secure defaults and a great developer experience. It's built on V8, Rust, and Tokio. learn more
ExpressJs: Web Applications Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications. learn more
Mongoose:: Elegant mongodb object modeling for node.js where mongodb is a NOSQL Database
Installation
I assume we all have mongodb install on our system, if not just google how to install mongodb and compass on your OS
follow this link to install denojs
Project setup
Create a folder called deno-api
Inside the deno-api folder, create the following folders (config, controller, model, router)
Database connection
Inside config folder, create a file db.ts and paste this code
import { createRequire } from "https://deno.land/std/node/module.ts";
const require = createRequire(import.meta.url);
import mongoose from 'npm:mongoose';
mongoose.connect('mongodb://localhost:27017/node-api')
.then(() => console.log('Connected!'));
Model setup
Inside the model folder, create a file called todo.ts and paste this code
import mongoose from "npm:mongoose"
const todoSchema = new mongoose.Schema({
title: {
type: String,
required: true
},
})
export default mongoose.model("Todo", todoSchema)
Controller setup
Inside the controller folder create a file called todo.ts and paste this code
import Todo from "../models/todo.ts"
import { Request, Response } from "npm:express"
// get one
const getTodo = async (req: Request, res: Response) => {
try {
const todo = await Todo.findById(req.params.id)
if(!todo) {
return res.status(404).json({message: "not found"})
}
return res.status(200).json({todo})
} catch (error) {
res.json({ message: error.message })
}
}
// get all
const getTodos = async (req: Request, res: Response) => {
try {
const todos = await Todo.find()
return res.json(todos)
} catch (error) {
res.json({ message: error.message })
}
}
// ceate new
const createTodo = async (req: Request, res: Response) => {
const todo = new Todo({
title: req.body.title,
})
try {
const newTodo = await todo.save()
res.status(201).json(newTodo)
} catch (error) {
res.status(400).json({ message: error.message })
}
}
// update
const updateTodo = async (req: Request, res: Response) => {
try {
const todo = await Todo.findById(req.params.id)
if (todo == null) {
return res.status(404).json({ message: "Cannot find todo" })
}
if (req.body.title != null) {
todo.title = req.body.title
}
const updatedTodo = await todo.save()
return res.json(updatedTodo)
} catch (error) {
res.status(500).json({ message: error.message })
}
}
// delete
const deleteTodo = async (req: Request, res: Response) => {
try {
const user = await Todo.findById(req.params.id)
if (user == null) {
return res.status(404).json({ message: "Cannot find todo" })
}
await user.remove()
res.json({ message: "Deleted todo" })
} catch (error) {
res.status(500).json({ message: error.message })
}
}
export { getTodo, getTodos, createTodo, updateTodo, deleteTodo }
Route setup
Inside the router folder, create a file called todo.ts and paste this code
import express from "npm:express"
import {getTodo, getTodos, createTodo, updateTodo, deleteTodo } from "../controller/user.ts"
const router = express.Router()
router.get("/", getTodos)
router.get("/:id", getTodo)
router.post("/", createTodo)
router.put("/:id", updateTodo)
router.delete("/:id",deleteTodo)
export default router
App entry point
In the root folder create a file called main.ts and paste the following
import express from "npm:express";
import './config/db.ts'
import todo from "./router/todo.ts"
const app = express()
const port = 3000
app.use(express.json())
app.use("/todos", todo)
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`app listening on port ${port}`)
})
Application start up
Remember to startup the mongodb server also
deno run --watch -A main.ts
Docker setup
create a Dockerfile in the root directory and paste
FROM denoland/deno:1.10.3
WORKDIR /app
COPY . /app
EXPOSE 3000
CMD ["deno", "run", "--watch -A", "main.ts"]
Subscribe to my newsletter
Read articles from Gaiya M. Obed directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Gaiya M. Obed
Gaiya M. Obed
I am a highly skilled software engineer based in Abuja, Nigeria, specialisng in cutting-edge technologies including JavaScript, TypeScript, Node.js, React-Native, PHP, ASP.NET Core, and machine learning. With a fervent passion for innovation and a talent for problem-solving, I excel in crafting sophisticated and high-performance web applications. My expertise lies in seamlessly blending creativity with technical prowess to deliver unparalleled user experiences. I pride myself on my ability to develop intelligent solutions that not only meet but exceed expectations. With a keen eye for detail and a dedication to excellence, I am committed to transforming abstract concepts into impactful and transformative digital solutions. Let’s embark on a journey of innovation together. Explore my portfolio to witness the fusion of technology and creativity, and let’s discuss how I can elevate your digital presence and bring your vision to life.