Skip to main content

2 posts tagged with "prisma"

View All Tags

· 4 min read
Mitch Chimwemwe Chanza

Throughout this series, we will construct a comprehensive backend utilizing contemporary tools and cutting-edge concepts. My earnest desire is for you to accompany this journey from its inception, following the episodes in the order of their publication. This sequential approach is designed to facilitate a thorough understanding of the foundational concepts, making it particularly beneficial for beginners. However, if you happen to be an expert in the field, feel free to leverage your skills and customize the process to align with your specific objectives. Whether you're just starting out or a seasoned professional, there's something valuable for everyone in this series as we delve into the intricacies of backend development.

Please note that there will be coresponding youtube videos for each topic we cover in this series

Project Setup

Let's initiate the project setup and push it to GitHub. In this endeavor, we will be employing various frameworks, libraries, and programming languages. The selection of tools is independent of the project structure. Below is a list of tools we will be utilizing:

As the project progresses, additional tools may be incorporated into this list.

Create a Monorepo

Assuming PNPM is installed (for installation instructions, refer to pnpm), let's create a monorepo:

mkdir api-monorepo
cd api-monorepo
# Create an API folder
mkdir api
# Initialize PNPM project
pnpm init
# Initialize PNPM monorepo configuration
touch pnpm-workspace.yaml
# Add the following in the workspace file
packages:
- "api"
- "frontend" # This is optional for now
# setup api project
cd api
# initialize project
pnpm init
# install initial dependencies
pnpm add -D typescript @types/node
# initialize typescript
npx tsc --init
# modify tsconfig.json to suit your development requirements. you might want to enable more features in that file.


With these steps completed, we are prepared to weave together the components of our project. This marks the beginning of our successful project journey.

Dive into Part 2 of this series.

It is advisable to commit our modifications and push them to the GitHub repository. This precaution ensures that, in the event of any issues with our local version, we can easily retrieve the latest version from the remote repository. For further insights on GitHub and its functionalities please refer to github documementation .

The entirety of this project is available to the public on Github, where you can find all the settings and components featured in the series. Each part of the series corresponds to a branch within the repository. To access the completed project, simply navigate to the main branch.

· 5 min read
Mitch Chimwemwe Chanza
note

Refer to the earlier post - part 1 , to familiarize yourself with the configuration outlined there. This will enable you to continue with the instructions provided in this guide.

Quick Overview

in this part we are going to implement the following:

  • Install additional dependencies
  • Additional project configurations
  • Setup minimal server using express
  • Test the server

Initial Server configuration

# create a src folder inside api folder
mkdir -p api/src
#create main typescript file
touch api/src/main.ts
# lets change directory to api
cd api
# install additional api dependencies
pnpm add cors express dotenv
# this will install three dependencies in devdependencies
pnpm add -D @types/{node,cors,express} nodemon

info

Important: Additional configuration

It's worth mentioning that when using pnpm, we have the ability to set filters in order to run scripts globally in the project. Let's go ahead and set up some global scripts with filters. We also need to trim the typescript compile configuration file tsconfig.json.

{
"scripts" {
"api":"pnpm --filter api"
}
// ... rest of the configuration
}

Adding additional settings to our project is optional but can help reduce clutter in your script. Specifically, we need to configure nodemon to run .ts files without waiting for compilation. This can be achieved by using the ts-node module. Let's take a look at the configuration.

# we need first to install ts-node
pnpm api add -D ts-node

Following the installation of ts-node, the next step involves configuring nodemon to operate in conjunction with ts-node. To achieve this, it is necessary to establish a nodemon configuration file, nodemon.json, located at the root of our project. Additionally, we must modify our dev script to execute nodemon while adhering to the specified configuration.

{
"watch": ["src","graphql","hasura","prisma,tsconfig.json,package.json,.env"],
"ext": "ts,graphql,json,prisma,js,env",
"ignore": ["**/*.spec.ts","**/*.spec.graphql","**/*.spec.json","**/*.spec.js"],
"execMap": {
"ts": "ts-node ./src/main.ts"
},

"exec": "ts-node ./src/main.ts"
}

Now that we have prepared the environment for our server to run smoothly, it's time to set up the server and test it. we need to create two files, the main entery file for our api api/src/main.ts and environmental variables file api/.env

import express, { json } from "express";
import cors from "cors";
import dotenv from "dotenv";
dotenv.config();
const env = process.env;
const app = express();
// Initialse base router
const router = express.Router();
// Set initial route
router.get("/", (_req, res) => {
res.send({ message: "Monorepo API Configured!", success: true});
});
// Set v1/api endpoint
app.use("/v1/api", router);
// configure cors. the delimeter here can be anything that you have used in your .env file. for my example here am using comma to separate the urls.
app.use(cors({ origin: env.ALLOWED_ORIGINS?.split(",") }));
// enable json serialization
app.use(json());
// start server
app.listen(env.PORT ? +env.PORT : 9000, () => {
console.log(`Server started on http://localhost:${env.PORT}/v1/api`);
})

Lets run the server now.

pnpm api dev
# our server shpuld be up and running on http://localhost:9100 or http://localhost:9000 depending on the PORT set in .env file

Am glad you have made it this far. we have more to cover in this series. proceed to Part 3 to get started.