Mongodb(Mongoose) Provider

This provider sets up MongoDB connectivity with Mongoose for Express projects, including environment validation, a database connection helper, and a logger.

Features

  • Type-safe environment validation with Zod
  • Ready-to-use MongoDB connection helper
  • Pino logger configured for dev and production

Installation Guide

npx servercn-cli add pr mongodb-mongoose

File Structure

  • src/configs/env.ts
  • src/configs/db.ts
  • src/utils/logger.ts
  • src/shared/configs/env.ts
  • src/db/db.ts
  • src/shared/utils/logger.ts

Environment Configuration

src/configs/env.ts
import "dotenv-flow/config";
import { z } from "zod";
 
export const envSchema = z.object({
  NODE_ENV: z
    .enum(["development", "test", "production"])
    .default("development"),
  PORT: z.string().regex(/^\d+$/, "PORT must be a number").transform(Number),
  DATABASE_URL: z.url(),
  CORS_ORIGIN: z.url(),
  LOG_LEVEL: z
    .enum(["fatal", "error", "warn", "info", "debug", "trace"])
    .default("info")
});
 
export type Env = z.infer<typeof envSchema>;
 
const result = envSchema.safeParse(process.env);
 
if (!result.success) {
  console.error("❌ Invalid environment configuration");
  console.error(z.prettifyError(result.error));
  process.exit(1);
}
 
export const env: Readonly<Env> = Object.freeze(result.data);
 
export default env;

Database Connection

src/configs/db.ts
import mongoose from "mongoose";
import env from "./env";
import { logger } from "../utils/logger";
 
if (!env.DATABASE_URL) {
  throw new Error("Please provide DATABASE_URL in the environment variables");
}
 
export const connectDB = async (): Promise<void> => {
  try {
    const conn = await mongoose.connect(env.DATABASE_URL as string);
    logger.info(`MongoDB Connected: ${conn.connection.host}`);
  } catch (error) {
    logger.error(error, "MongoDB Connection Failed:");
    process.exit(1);
  }
};

Logger

src/utils/logger.ts
import pino from "pino";
import env from "../configs/env";
 
export const logger = pino({
  level: env.LOG_LEVEL,
  transport:
    env.NODE_ENV !== "production"
      ? {
          target: "pino-pretty",
          options: {
            colorize: true,
            translateTime: "yyyy-mm-dd HH:MM:ss",
            ignore: "pid,hostname"
          }
        }
      : undefined
});

Usage

import { connectDB } from "./configs/db";
 
await connectDB();

Example .env

NODE_ENV=development
PORT=8000
DATABASE_URL=mongodb://localhost:27017/app
CORS_ORIGIN=http://localhost:3000
LOG_LEVEL=info

File & Folder Structure

Loading files...

Installation

npx servercn-cli add provider mongodb-mongoose