Introduction
In today's digital-first world, creating a job portal isn’t just about displaying listings—it’s about providing users with a seamless, real-time experience. In this article, I'll walk you through building a scalable job board using React and Node.js, with Google Authentication for user logins. This step-by-step guide will cover everything from backend setup to UI/UX design best practices.
Why This Project?
With this project, you'll gain hands-on experience with skills highly sought after in web development, including real-time data processing, authentication, and component-based architecture. Plus, by deploying this project, you’ll have an impressive portfolio piece that stands out!
*1. Setting Up the Backend: *Node.js & Express
First, create a new directory and initialize it as a Node.js project:
mkdir job-board-portal
cd job-board-portal
npm init -y
Install essential packages:
npm install express mongoose passport-google-oauth20
Database Design
We’ll use MongoDB Atlas to store job postings and user data. Here’s a simple schema:
**const jobSchema = new mongoose.Schema({
title: String,
description: String,
skillsRequired: [String],
applicationLink: String,
postedAt: { type: Date, default: Date.now },
});
const Job = mongoose.model("Job", jobSchema);**
API Routes
Create API endpoints for CRUD operations on job listings:
app.get('/api/jobs', async (req, res) => {
const jobs = await Job.find();
res.json(jobs);
});
app.post('/api/jobs', async (req, res) => {
const newJob = new Job(req.body);
await newJob.save();
res.status(201).json(newJob);
});
- Integrating Google Authentication
Authentication is critical for a job board. We’ll use Google OAuth with Passport.js to allow users to sign in using their Google accounts.
const GoogleStrategy = require('passport-google-oauth20').Strategy;
passport.use(new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: "http://localhost:5000/auth/google/callback"
},
function(accessToken, refreshToken, profile, done) {
// Find or create user in database
}
));
- Building the Frontend: React + Drizzle ORM
To manage UI state effectively, we'll use React alongside Drizzle ORM for efficient database interactions.
Job List Component
Display job listings with real-time updates:
import React, { useEffect, useState } from 'react';
import axios from 'axios';
function JobList() {
const [jobs, setJobs] = useState([]);
useEffect(() => {
async function fetchJobs() {
const response = await axios.get('/api/jobs');
setJobs(response.data);
}
fetchJobs();
}, []);
return (
{jobs.map((job) => (
{job.title}
{job.description}
Apply
))}
);
}
Styling with CSS Modules
Make the UI stand out with CSS Modules. Here’s a quick style guide to make components look clean and modern.
.jobList {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1rem;
}
.jobItem {
background: #f4f4f9;
padding: 1rem;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}
- Deploying with Netlify and Heroku
Once everything is working locally, deploy your frontend on Netlify and backend on Heroku. This setup ensures fast, reliable access for users.
- Going the Extra Mile: Adding Real-Time Notifications
Want to impress further? Integrate real-time notifications with Socket.io so users can receive updates on job listings as soon as they’re posted!
Conclusion
By following these steps, you've built a feature-rich, scalable job portal using modern tech. This isn’t just a learning project; it’s something you could genuinely deploy and use. Let me know your thoughts, questions, and how you customized your job board in the comments!