Express.js Database Integration

Connect Express.js to databases like MongoDB, PostgreSQL, and MySQL. Learn about ORMs, query optimization, and data modeling.

Overview

Express.js works seamlessly with any database. This guide covers integrating popular databases and using ORMs for data management.

Database Options

Popular choices for Express.js applications: - **MongoDB**: NoSQL document database, great with Mongoose ODM - **PostgreSQL**: Powerful relational database, works with Sequelize or Prisma - **MySQL**: Popular relational database with strong ORM support - **SQLite**: Lightweight, file-based database for development

ORMs and ODMs

Object-Relational Mapping (ORM) tools help you work with databases using JavaScript objects: - **Mongoose**: MongoDB ODM with schema validation - **Sequelize**: Multi-database ORM supporting PostgreSQL, MySQL, SQLite - **Prisma**: Modern type-safe ORM with great developer experience

Connection Management

Properly managing database connections is crucial for performance and reliability. Use connection pooling and handle connection errors gracefully.

Code Examples

MongoDB with Mongoose

db/mongodb.js
const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log('MongoDB connected');
  } catch (error) {
    console.error('MongoDB connection error:', error);
    process.exit(1);
  }
};

// User Schema
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  createdAt: { type: Date, default: Date.now }
});

const User = mongoose.model('User', userSchema);

module.exports = { connectDB, User };

PostgreSQL with Prisma

db/prisma.js
// schema.prisma
// datasource db {
//   provider = "postgresql"
//   url      = env("DATABASE_URL")
// }
//
// model User {
//   id        Int      @id @default(autoincrement())
//   email     String   @unique
//   name      String?
//   posts     Post[]
//   createdAt DateTime @default(now())
// }

const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

// CRUD Operations
app.get('/users', async (req, res) => {
  const users = await prisma.user.findMany({
    include: { posts: true }
  });
  res.json(users);
});

app.post('/users', async (req, res) => {
  const user = await prisma.user.create({
    data: req.body
  });
  res.status(201).json(user);
});

Connection Pool with PostgreSQL

db/pool.js
const { Pool } = require('pg');

const pool = new Pool({
  user: process.env.DB_USER,
  host: process.env.DB_HOST,
  database: process.env.DB_NAME,
  password: process.env.DB_PASSWORD,
  port: 5432,
  max: 20, // Maximum connections
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000,
});

// Query helper
const query = async (text, params) => {
  const start = Date.now();
  const result = await pool.query(text, params);
  console.log('Query executed in', Date.now() - start, 'ms');
  return result;
};

// Usage in routes
app.get('/users', async (req, res) => {
  const { rows } = await query('SELECT * FROM users');
  res.json(rows);
});

Frequently Asked Questions

Which database should I choose for my Express app?
Choose based on your data structure and needs. MongoDB is great for flexible schemas and rapid development. PostgreSQL for complex queries and relations. MySQL for traditional web apps. Consider your team's experience too.
Should I use an ORM or raw queries?
ORMs like Prisma or Sequelize speed up development and provide type safety. Raw queries offer more control and performance for complex operations. Many projects use both - ORM for CRUD, raw queries for complex operations.
How do I handle database errors in Express?
Wrap database operations in try-catch blocks, create specific error handlers for database errors, and use transactions for operations that need to be atomic. Always sanitize inputs to prevent SQL injection.

Need expert help with Express.js?

Our team at Slashdev.io builds production-ready Express.js applications.