{"id":42071976,"url":"https://github.com/KhaledSaeed18/node-express-boilerplate","last_synced_at":"2026-02-05T09:01:04.574Z","repository":{"id":270762755,"uuid":"911385510","full_name":"KhaledSaeed18/node-express-boilerplate","owner":"KhaledSaeed18","description":"Express.js boilerplate provides a solid foundation for building scalable REST APIs using modern development practices, clean architecture principles, and industry-standard security measures.","archived":false,"fork":false,"pushed_at":"2025-07-12T16:53:27.000Z","size":162,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-12T18:42:11.844Z","etag":null,"topics":["authentication","backend","bcryptjs","crud","express-rate-limit","express-validator","expressjs","jsonwebtoken","middleware","morgan","nodejs","pagination","postgresql-database","prisma-orm","solid-principles","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KhaledSaeed18.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-02T22:27:03.000Z","updated_at":"2025-07-12T16:53:30.000Z","dependencies_parsed_at":"2025-01-02T23:27:21.697Z","dependency_job_id":"98684ecf-87dd-4e84-b4b7-a91e0b7a8c55","html_url":"https://github.com/KhaledSaeed18/node-express-boilerplate","commit_stats":null,"previous_names":["khaledsaeed18/express-notes-app-with-typescript-prisma-postgresql","khaledsaeed18/node-express-boilerplate"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/KhaledSaeed18/node-express-boilerplate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhaledSaeed18%2Fnode-express-boilerplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhaledSaeed18%2Fnode-express-boilerplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhaledSaeed18%2Fnode-express-boilerplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhaledSaeed18%2Fnode-express-boilerplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KhaledSaeed18","download_url":"https://codeload.github.com/KhaledSaeed18/node-express-boilerplate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhaledSaeed18%2Fnode-express-boilerplate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29117916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T05:31:32.482Z","status":"ssl_error","status_checked_at":"2026-02-05T05:31:29.075Z","response_time":65,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authentication","backend","bcryptjs","crud","express-rate-limit","express-validator","expressjs","jsonwebtoken","middleware","morgan","nodejs","pagination","postgresql-database","prisma-orm","solid-principles","typescript"],"created_at":"2026-01-26T09:00:39.715Z","updated_at":"2026-02-05T09:01:04.552Z","avatar_url":"https://github.com/KhaledSaeed18.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Express.js TypeScript Production-Ready Boilerplate\n\n[![Node.js](https://img.shields.io/badge/Node.js-339933?style=for-the-badge\u0026logo=nodedotjs\u0026logoColor=white)](https://nodejs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n[![Express.js](https://img.shields.io/badge/Express.js-000000?style=for-the-badge\u0026logo=express\u0026logoColor=white)](https://expressjs.com/)\n[![Prisma](https://img.shields.io/badge/Prisma-3982CE?style=for-the-badge\u0026logo=Prisma\u0026logoColor=white)](https://www.prisma.io/)\n[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-316192?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white)](https://www.postgresql.org/)\n\n\u003e **A production-ready Express.js TypeScript boilerplate** featuring enterprise-grade architecture with comprehensive authentication, note management, and advanced security implementations.\n\nThis boilerplate provides a solid foundation for building scalable REST APIs using modern development practices, clean architecture principles, and industry-standard security measures. Perfect for developers who want to kickstart their projects with a well-structured, maintainable codebase.\n\n## ✨ Key Features\n\n### 🏗️ **Architecture \u0026 Design Patterns**\n\n- **Object-Oriented Programming (OOP)** with TypeScript classes and interfaces\n- **Repository Pattern** for data access abstraction\n- **Service Layer Architecture** for business logic separation\n- **Dependency Injection Container** for loose coupling\n- **Clean Architecture** with proper separation of concerns\n- **SOLID Principles** implementation throughout the codebase\n\n### 🔐 **Security \u0026 Authentication**\n\n- **JWT-based Authentication** with access and refresh tokens\n- **HttpOnly Cookies** for enhanced security\n- **Password Hashing** using bcrypt with salt rounds\n- **Rate Limiting** to prevent abuse and DDoS attacks\n- **Input Validation** with express-validator\n- **CORS Protection** with configurable origins\n- **Helmet.js** for security headers\n- **Environment Variables** protection\n\n### 🗄️ **Database \u0026 ORM**\n\n- **PostgreSQL** with Prisma ORM\n- **Database Migrations** with version control\n- **Connection Pooling** for optimal performance\n- **Database Seeding** for development/testing\n- **Type-Safe Database Queries** with Prisma Client\n\n### 🛠️ **Development Experience**\n\n- **Full TypeScript Support** with strict type checking\n- **Hot Reload** with nodemon for development\n- **Comprehensive Error Handling** with custom error classes\n- **Request Logging** with morgan\n- **API Documentation** ready structure\n- **Production Build** optimization\n\n### 🚀 **Performance \u0026 Scalability**\n\n- **Pagination Support** for large datasets\n- **Search Functionality** with optimized queries\n- **Cookie Management** with security best practices\n- **Efficient Database Indexing** for performance\n- **Middleware Pipeline** for request processing\n\n## 🛠️ Tech Stack\n\n### **Backend Core**\n\n- **Node.js** - JavaScript runtime environment\n- **Express.js** - Fast, unopinionated web framework\n- **TypeScript** - Static type checking and enhanced developer experience\n\n### **Database \u0026 ORM**\n\n- **PostgreSQL** - Robust, enterprise-grade relational database\n- **Prisma ORM** - Next-generation Node.js and TypeScript ORM\n- **Prisma Client** - Type-safe database client\n\n### **Authentication \u0026 Security**\n\n- **JSON Web Tokens (JWT)** - Stateless authentication\n- **bcrypt.js** - Password hashing and salting\n- **Helmet.js** - Security headers middleware\n- **express-rate-limit** - Rate limiting middleware\n- **CORS** - Cross-origin resource sharing\n\n### **Validation \u0026 Middleware**\n\n- **express-validator** - Server-side validation\n- **cookie-parser** - Cookie parsing middleware\n- **morgan** - HTTP request logging\n- **dotenv** - Environment variable management\n\n### **Development Tools**\n\n- **nodemon** - Development server with hot reload\n- **ts-node** - TypeScript execution for Node.js\n- **pnpm** - Fast, disk space efficient package manager\n\n## 🏗️ Project Architecture\n\nThis boilerplate follows **Clean Architecture** principles with a well-defined **separation of concerns**:\n\n### **📁 Directory Structure**\n\n```text\nsrc/\n├── controllers/          # HTTP request handlers\n│   ├── base.controller.ts   # Base controller with common methods\n│   ├── auth.controller.ts   # Authentication endpoints\n│   └── note.controller.ts   # Note management endpoints\n├── services/             # Business logic layer\n│   ├── base.service.ts      # Base service with common utilities\n│   ├── auth.service.ts      # Authentication business logic\n│   └── note.service.ts      # Note management business logic\n├── repository/           # Data access layer\n│   ├── base.repository.ts   # Base repository with common DB operations\n│   ├── user.repository.ts   # User data access methods\n│   └── note.repository.ts   # Note data access methods\n├── middleware/           # Custom middleware functions\n│   ├── auth.middleware.ts   # JWT authentication middleware\n│   ├── error.middleware.ts  # Global error handling\n│   ├── limiter.middleware.ts # Rate limiting\n│   └── pagination.middleware.ts # Pagination helper\n├── validations/          # Input validation schemas\n│   ├── auth.validation.ts   # Authentication validation rules\n│   └── note.validation.ts   # Note validation rules\n├── utils/               # Helper functions and utilities\n│   ├── generateToken.ts     # JWT token generation\n│   ├── error.ts            # Custom error classes\n│   └── userNames.ts        # Username generation utilities\n├── types/               # TypeScript type definitions\n│   └── index.ts            # Application-wide types and interfaces\n├── constants/           # Application constants\n│   └── index.ts            # Common constants and configuration\n├── container/           # Dependency injection container\n│   └── index.ts            # IoC container implementation\n├── routes/              # API route definitions\n│   ├── auth.routes.ts      # Authentication routes\n│   └── note.routes.ts      # Note management routes\n├── database/            # Database configuration\n│   └── prismaClient.ts     # Prisma client setup\n└── index.ts             # Application entry point\n```\n\n### **🔄 Architecture Patterns**\n\n#### **1. Repository Pattern**\n\n```typescript\n// Abstract data access layer\ninterface IUserRepository {\n  findById(id: string): Promise\u003cUser | null\u003e;\n  findByEmail(email: string): Promise\u003cUser | null\u003e;\n  create(userData: CreateUserDTO): Promise\u003cUser\u003e;\n  update(id: string, userData: UpdateUserDTO): Promise\u003cUser\u003e;\n  delete(id: string): Promise\u003cvoid\u003e;\n}\n```\n\n#### **2. Service Layer Pattern**\n\n```typescript\n// Business logic encapsulation\nclass AuthService {\n  constructor(private userRepository: IUserRepository) {}\n  \n  async signup(userData: SignUpDTO): Promise\u003cAuthResponseDTO\u003e {\n    // Business logic implementation\n    // Validation, password hashing, user creation\n  }\n}\n```\n\n#### **3. Dependency Injection Container**\n\n```typescript\n// IoC Container for managing dependencies\nclass Container {\n  private static instance: Container;\n  \n  public static getInstance(prisma: PrismaClient): Container {\n    if (!Container.instance) {\n      Container.instance = new Container(prisma);\n    }\n    return Container.instance;\n  }\n  \n  // Dependency registration and resolution\n}\n```\n\n#### **4. Controller Pattern**\n\n```typescript\n// HTTP request handling with proper error management\nclass AuthController extends BaseController {\n  constructor(private authService: IAuthService) {\n    super();\n  }\n  \n  public signup = async (req: Request, res: Response, next: NextFunction) =\u003e {\n    // Request validation, service call, response formatting\n  };\n}\n```\n\n### **🎯 SOLID Principles Implementation**\n\n- **Single Responsibility Principle**: Each class has one reason to change\n- **Open/Closed Principle**: Open for extension, closed for modification\n- **Liskov Substitution Principle**: Derived classes must be substitutable for base classes\n- **Interface Segregation Principle**: Clients shouldn't depend on interfaces they don't use\n- **Dependency Inversion Principle**: Depend on abstractions, not concretions\n\n## 🔒 Security Features\n\n### **Authentication \u0026 Authorization**\n\n- **JWT Token Strategy**: Access tokens (short-lived) + Refresh tokens (long-lived)\n- **HttpOnly Cookies**: Prevents XSS attacks by making tokens inaccessible to client-side scripts\n- **Secure Cookie Configuration**: `SameSite=Strict`, `Secure=true` in production\n- **Password Security**: bcrypt hashing with configurable salt rounds\n- **Token Expiration**: Automatic token refresh mechanism\n\n### **Input Validation \u0026 Sanitization**\n\n- **Express-validator**: Comprehensive input validation with custom rules\n- **Email Domain Blocking**: Prevents registration from disposable email services\n- **Password Complexity**: Enforces strong password requirements\n- **SQL Injection Prevention**: Prisma ORM provides built-in protection\n- **XSS Protection**: Input sanitization and output encoding\n\n### **Rate Limiting \u0026 DoS Protection**\n\n- **Configurable Rate Limits**: Different limits for auth and API endpoints\n- **IP-based Tracking**: Prevents abuse from specific IP addresses\n- **Memory-efficient Storage**: Optimized for production environments\n- **Graceful Degradation**: Proper error responses when limits are exceeded\n\n### **Security Headers**\n\n- **Helmet.js Integration**: Comprehensive security headers\n- **CORS Configuration**: Configurable allowed origins\n- **Content Security Policy**: Prevents XSS and data injection attacks\n- **HSTS**: HTTP Strict Transport Security for HTTPS enforcement\n\n## 🚨 Error Handling\n\n### **Centralized Error Management**\n\n```typescript\n// Custom Error Classes Hierarchy\nclass AppError extends Error {\n  public statusCode: number;\n  public isOperational: boolean;\n  // Error categorization and handling\n}\n\nclass ValidationError extends AppError {\n  public errors?: Array\u003c{\n    field: string;\n    message: string;\n    value?: any;\n  }\u003e;\n  // Detailed validation error information\n}\n```\n\n### **Error Categories**\n\n- **ValidationError** (400): Input validation failures\n- **AuthenticationError** (401): Authentication failures\n- **AuthorizationError** (403): Permission denied\n- **NotFoundError** (404): Resource not found\n- **ConflictError** (409): Resource conflicts\n- **InternalServerError** (500): Unexpected server errors\n\n### **Error Response Format**\n\n```json\n{\n  \"statusCode\": 400,\n  \"message\": \"Validation failed\",\n  \"errors\": [\n    {\n      \"field\": \"email\",\n      \"message\": \"Invalid email format\",\n      \"value\": \"invalid-email\"\n    }\n  ],\n  \"stack\": \"...\" // Only in development\n}\n```\n\n## 📊 Database Design\n\n### **Schema Overview**\n\n```sql\n-- Users table with optimized indexing\nCREATE TABLE users (\n  id          TEXT PRIMARY KEY,\n  username    TEXT UNIQUE NOT NULL,\n  email       TEXT UNIQUE NOT NULL,\n  password    TEXT NOT NULL,\n  created_at  TIMESTAMP DEFAULT NOW(),\n  updated_at  TIMESTAMP DEFAULT NOW()\n);\n\n-- Notes table with foreign key relationships\nCREATE TABLE notes (\n  id          TEXT PRIMARY KEY,\n  title       TEXT NOT NULL,\n  content     TEXT NOT NULL,\n  user_id     TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n  created_at  TIMESTAMP DEFAULT NOW(),\n  updated_at  TIMESTAMP DEFAULT NOW()\n);\n\n-- Optimized indexes for performance\nCREATE INDEX idx_users_email ON users(email);\nCREATE INDEX idx_notes_user_id ON notes(user_id);\nCREATE INDEX idx_notes_title ON notes(title);\n```\n\n### **Database Features**\n\n- **ACID Compliance**: Full transaction support\n- **Cascade Deletes**: Automatic cleanup of related records\n- **Optimized Indexing**: Enhanced query performance\n- **Connection Pooling**: Efficient database connections\n- **Migration System**: Version-controlled schema changes\n\n## 🔄 Development Workflow\n\n### **Database Operations**\n\n```bash\n# Database setup and migrations\npnpm prisma:generate      # Generate Prisma client\npnpm prisma:migrate       # Run migrations\npnpm prisma:studio        # Open Prisma Studio\npnpm prisma:db:seed       # Seed database with test data\npnpm prisma:migrate:reset # Reset and re-migrate database\n```\n\n### **Development Commands**\n\n```bash\n# Development server with hot reload\npnpm dev\n\n# Type checking without compilation\npnpm type-check\n\n# Production build\npnpm build\n\n# Production server\npnpm start\n```\n\n## 🚀 Quick Start\n\n### **Prerequisites**\n\n- **Node.js**\n- **PostgreSQL**\n- **pnpm** - `npm install -g pnpm`\n\n### **Installation**\n\n1. **Clone the repository**\n\n   ```bash\n   git clone https://github.com/KhaledSaeed18/node-express-boilerplate.git\n   cd node-express-boilerplate\n   ```\n\n2. **Install dependencies**\n\n   ```bash\n   pnpm install\n   ```\n\n3. **Environment Configuration**\n\n   Create a `.env` file in the root directory:\n\n   ```env\n   # Server Configuration\n   PORT=3000\n   API_VERSION=v1\n   BASE_URL=/api\n   NODE_ENV=development\n\n   # Database Configuration\n   DATABASE_URL=postgresql://username:password@localhost:5432/notes-app\n\n   # JWT Configuration\n   JWT_SECRET=your-super-secret-jwt-key-here\n   JWT_REFRESH_SECRET=your-refresh-secret-key-here\n   JWT_EXPIRE_TIME=15m\n   JWT_REFRESH_EXPIRE_TIME=7d\n\n   # Client Configuration\n   CLIENT_URL=http://localhost:3000\n   ```\n\n4. **Database Setup**\n\n   ```bash\n   # Generate Prisma client\n   pnpm prisma:generate\n\n   # Run database migrations\n   pnpm prisma:migrate\n\n   # Seed the database with sample data\n   pnpm prisma:db:seed\n   ```\n\n5. **Start Development Server**\n\n   ```bash\n   pnpm dev\n   ```\n\n   The server will start on `http://localhost:3000`\n\n### **Production Deployment**\n\n1. **Build the application**\n\n   ```bash\n   pnpm build\n   ```\n\n2. **Deploy database migrations**\n\n   ```bash\n   pnpm prisma:migrate:deploy\n   ```\n\n3. **Start production server**\n\n   ```bash\n   pnpm start\n   ```\n\n## 📚 API Documentation\n\n### **Base URL**\n\n```text\nhttp://localhost:3000/api/v1\n```\n\n### **Authentication Endpoints**\n\n| Method | Endpoint | Description | Body |\n|--------|----------|-------------|------|\n| POST | `/auth/signup` | Register new user | `{ \"email\": \"user@example.com\", \"password\": \"SecurePass123!\" }` |\n| POST | `/auth/signin` | Login user | `{ \"email\": \"user@example.com\", \"password\": \"SecurePass123!\" }` |\n| POST | `/auth/refresh-token` | Refresh access token | No body required |\n| POST | `/auth/logout` | Logout user | No body required |\n\n### **Note Management Endpoints**\n\n| Method | Endpoint | Description | Headers | Body |\n|--------|----------|-------------|---------|------|\n| POST | `/note/create-note` | Create new note | `Authorization: Bearer \u003ctoken\u003e` | `{ \"title\": \"Note Title\", \"content\": \"Note content\" }` |\n| GET | `/note/get-notes` | Get all notes (paginated) | `Authorization: Bearer \u003ctoken\u003e` | - |\n| GET | `/note/get-note/:id` | Get specific note | `Authorization: Bearer \u003ctoken\u003e` | - |\n| GET | `/note/search-notes` | Search notes | `Authorization: Bearer \u003ctoken\u003e` | Query: `?q=search term` |\n| PUT | `/note/update-note/:id` | Update note | `Authorization: Bearer \u003ctoken\u003e` | `{ \"title\": \"Updated Title\", \"content\": \"Updated content\" }` |\n| DELETE | `/note/delete-note/:id` | Delete note | `Authorization: Bearer \u003ctoken\u003e` | - |\n\n### **Query Parameters**\n\n#### **Pagination**\n\n- `page`: Page number (default: 1)\n- `limit`: Items per page (default: 10, max: 100)\n\n#### **Search**\n\n- `q`: Search query string\n- `sortBy`: Sort field (title, createdAt, updatedAt)\n- `sortOrder`: Sort order (asc, desc)\n\n### **Response Format**\n\n```json\n{\n  \"statusCode\": 200,\n  \"message\": \"Success message\",\n  \"data\": {\n    // Response data\n  },\n  \"pagination\": {\n    \"totalItems\": 100,\n    \"totalPages\": 10,\n    \"currentPage\": 1,\n    \"pageSize\": 10,\n    \"hasNext\": true,\n    \"hasPrevious\": false,\n    \"nextPage\": 2,\n    \"previousPage\": null\n  }\n}\n```\n\n## 🧪 Testing\n\n### **Sample API Calls**\n\n#### **User Registration**\n\n```bash\ncurl -X POST http://localhost:3000/api/v1/auth/signup \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"email\": \"test@example.com\",\n    \"password\": \"SecurePass123!\"\n  }'\n```\n\n#### **User Login**\n\n```bash\ncurl -X POST http://localhost:3000/api/v1/auth/signin \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"email\": \"test@example.com\",\n    \"password\": \"SecurePass123!\"\n  }'\n```\n\n#### **Create Note**\n\n```bash\ncurl -X POST http://localhost:3000/api/v1/note/create-note \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer YOUR_JWT_TOKEN\" \\\n  -d '{\n    \"title\": \"My First Note\",\n    \"content\": \"This is the content of my first note.\"\n  }'\n```\n\n#### **Get Notes with Pagination**\n\n```bash\ncurl -X GET \"http://localhost:3000/api/v1/note/get-notes?page=1\u0026limit=10\" \\\n  -H \"Authorization: Bearer YOUR_JWT_TOKEN\"\n```\n\n## 🛠️ Development Tools\n\n### **Prisma Studio**\n\nAccess the database GUI:\n\n```bash\npnpm prisma:studio\n```\n\nOpen `http://localhost:5555` to view and edit your database records.\n\n### **Database Management**\n\n```bash\n# View migration status\npnpm prisma:migrate:status\n\n# Reset database (development only)\npnpm prisma:migrate:reset\n\n# Pull schema from existing database\npnpm prisma:db:pull\n\n# Push schema changes without migrations\npnpm prisma:db:push\n\n# Validate Prisma schema\npnpm prisma:validate\n```\n\n## 🔧 Configuration\n\n### **Environment Variables**\n\n| Variable | Description | Default | Required |\n|----------|-------------|---------|----------|\n| `PORT` | Server port | 3000 | No |\n| `NODE_ENV` | Environment mode | development | No |\n| `DATABASE_URL` | PostgreSQL connection string | - | Yes |\n| `JWT_SECRET` | JWT signing secret | - | Yes |\n| `JWT_REFRESH_SECRET` | JWT refresh secret | - | Yes |\n| `JWT_EXPIRE_TIME` | Access token expiration | 15m | No |\n| `JWT_REFRESH_EXPIRE_TIME` | Refresh token expiration | 7d | No |\n| `CLIENT_URL` | Frontend URL for CORS | - | Yes |\n| `BCRYPT_SALT_ROUNDS` | Password hashing rounds | 12 | No |\n\n### **Database Configuration**\n\nThe application uses PostgreSQL with the following connection format:\n\n```text\npostgresql://[username]:[password]@[host]:[port]/[database]\n```\n\nExample:\n\n```text\npostgresql://myuser:mypassword@localhost:5432/notes-app\n```\n\n---\n\n⭐ **Star this repository if you find it helpful!** ⭐\n  ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKhaledSaeed18%2Fnode-express-boilerplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKhaledSaeed18%2Fnode-express-boilerplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKhaledSaeed18%2Fnode-express-boilerplate/lists"}