Node.js
Database Connection – MySQL, PostgreSQL & MongoDB
Connect a Node.js app to relational and NoSQL databases using mysql2 connection pools, the pg client for PostgreSQL, and Mongoose for MongoDB.
Install Drivers: Pick the driver for your database. You rarely need all three — install only what you use.
terminal
BASH
# MySQL
npm install mysql2
# PostgreSQL
npm install pg
# MongoDB
npm install mongoose
MySQL Connection Pool: Use
mysql2/promise to create a pool. Pools reuse connections and handle concurrency automatically.src/config/mysql.js
JS
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: process.env.DB_HOST || 'localhost',
port: process.env.DB_PORT || 3306,
user: process.env.DB_USER || 'root',
password: process.env.DB_PASS || '',
database: process.env.DB_NAME || 'myapp',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
});
// Test the connection on startup
(async () => {
try {
const conn = await pool.getConnection();
console.log('MySQL connected');
conn.release();
} catch (err) {
console.error('MySQL connection failed:', err.message);
process.exit(1);
}
})();
module.exports = pool;
Async Query Execution: Destructure the
[rows] result from pool.execute(). Always use parameterised queries to prevent SQL injection.src/models/User.js (MySQL)
JS
const pool = require('../config/mysql');
const findAll = async () => {
const [rows] = await pool.execute('SELECT id, name, email FROM users');
return rows;
};
const findById = async (id) => {
const [rows] = await pool.execute(
'SELECT * FROM users WHERE id = ? LIMIT 1',
[id]
);
return rows[0] || null;
};
const create = async ({ name, email, password }) => {
const [result] = await pool.execute(
'INSERT INTO users (name, email, password) VALUES (?, ?, ?)',
[name, email, password]
);
return { id: result.insertId, name, email };
};
const remove = async (id) => {
const [result] = await pool.execute('DELETE FROM users WHERE id = ?', [id]);
return result.affectedRows > 0;
};
module.exports = { findAll, findById, create, remove };
PostgreSQL with pg: Create a
Pool from the pg package using a connection string or individual config options.src/config/postgres.js
JS
const { Pool } = require('pg');
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
// Or explicit fields:
// host: process.env.PG_HOST,
// port: 5432,
// user: process.env.PG_USER,
// password: process.env.PG_PASS,
// database: process.env.PG_NAME,
ssl: process.env.NODE_ENV === 'production'
? { rejectUnauthorized: false }
: false,
});
pool.on('connect', () => console.log('PostgreSQL pool connected'));
pool.on('error', (err) => console.error('PG pool error', err));
// Helper for parameterised queries
const query = (text, params) => pool.query(text, params);
module.exports = { query, pool };
PostgreSQL Query Example: Use
$1, $2 placeholders (not ?) in pg queries.src/models/User.js (PG)
JS
const { query } = require('../config/postgres');
const findAll = async () => {
const { rows } = await query('SELECT id, name, email FROM users ORDER BY id');
return rows;
};
const findByEmail = async (email) => {
const { rows } = await query(
'SELECT * FROM users WHERE email = $1 LIMIT 1',
[email]
);
return rows[0] || null;
};
module.exports = { findAll, findByEmail };
MongoDB with Mongoose: Call
mongoose.connect() once at startup. Mongoose manages its own internal connection pool.src/config/mongodb.js
JS
const mongoose = require('mongoose');
const connectMongo = async () => {
try {
await mongoose.connect(process.env.MONGO_URI, {
dbName: 'myapp',
});
console.log('MongoDB connected:', mongoose.connection.host);
} catch (err) {
console.error('MongoDB connection error:', err.message);
process.exit(1);
}
};
mongoose.connection.on('disconnected', () =>
console.warn('MongoDB disconnected')
);
module.exports = connectMongo;