ساختار بندی پروژه

مقدمه

در این راهنما، گام‌به‌گام نحوهٔ شروع یک پروژه فول‌استک با React و Node.js و ساختار پیشنهادی پوشه‌ها و فایل‌ها تشریح شده است. این مستند مناسب تیم‌های توسعه است تا استاندارد یکپارچه‌ای برای ایجاد پروژه‌های جدید داشته باشند.

Screenshot 2025-05-14 095936

راه‌اندازی پروژه بک‌اند (Node.js + Express)

mkdir backend
cd backend
npm init -y
npm install express dotenv sequelize jsonwebtoken bcryptjs
npm install --save-dev nodemon

ساختار پوشه‌ها

backend/
├── config/
│   ├── db.js
│   ├── config.js
│   ├── development.js
│   ├── production.js
│   └── .dev.js
├── controller/
│   └── userController.js
├── routes/
│   └── userRoutes.js
├── service/
│   └── userService.js
├── utils/
│   └── generateToken.js
├── auth/
│   └── authMiddleware.js
├── .env
├── server.js
└── package.json

در server.js حتماً باید پورت پروژه را با مسئول DevOps تیم هماهنگ کنید.

پیکربندی اتصال به دیتابیس (config)

فایل db.js

این کلاس مسئول ایجاد اتصال Sequelize به PostgreSQL است:

import { Sequelize } from 'sequelize';
import configs from './config.js';

class DBConnection { constructor() { this.db_url = configs.db.url; const options = { dialect: "postgres", timezone: "+03:30", schema: 'schema', }; if (configs.db.useSSL === "true") { options.dialectOptions = { ssl: { require: true, rejectUnauthorized: false } }; } this.db = new Sequelize(this.db_url, options); }

getSequelizeInstance() { return this.db; } }

const sequelize = new DBConnection().getSequelizeInstance(); export default sequelize;

فایل config.js

براساس مقدار NODE_ENV یکی از فایل‌های محیطی (development، production، .dev) وارد می‌شود:

const env = process.env.NODE_ENV || 'development';
const configs = await import(`./.${env}.js`).then(m => m.default);
export default configs;

پیکربندی اتصال به دیتابیس (config)

فایل db.js

این کلاس مسئول ایجاد اتصال Sequelize به PostgreSQL است:


import { Sequelize } from 'sequelize';
import configs from './config.js';

class DBConnection { constructor() { this.db_url = configs.db.url; const options = { dialect: "postgres", timezone: "+03:30", schema: 'schema Name', }; if (configs.db.useSSL === "true") { options.dialectOptions = { ssl: { require: true, rejectUnauthorized: false } }; } this.db = new Sequelize(this.db_url, options); }

getSequelizeInstance() { return this.db; } }

const sequelize = new DBConnection().getSequelizeInstance(); export default sequelize;

فایل config.js

براساس مقدار NODE_ENV یکی از فایل‌های محیطی (development، production، .dev) وارد می‌شود:


const env = process.env.NODE_ENV || 'development';
const configs = await import(`./.${env}.js`).then(m => m.default);
export default configs;
    

فایل‌های محیطی

در این فایل‌ها تنظیمات مربوط به هر محیط (production، development، .dev) قرار دارد:

production.js


export default {
  app: {
    port: 3000,
    apiBaseUrl: process.env.API_BASE_URL || 'url',
    ssoBaseUrl: 'url',
    paymentBaseUrl: process.env.PAYMENT_BASE_URL || 'url',
    useMockUsername: process.env.USE_MOCK_USERNAME || 'false',
    mockUsername: process.env.MOCK_USERNAME || '',
  },
  db: {
    url: process.env.DB_URL || 'postgresql://postgreess',
    useSSL: process.env.DB_USE_SSL || 'false',
  },
  redis: {
    host: process.env.REDIS_HOST || 'host url',
    port: process.env.REDIS_PORT || port,
    sentinelNodes: process.env.REDIS_SENTINEL_NODES || '',
    sentinelName: process.env.REDIS_SENTINEL_MASTER || 'mymaster',
    password: process.env.REDIS_PASSWORD || 'password',
    dbNo: process.env.REDIS_DB_NO || 0,
    prefix: process.env.REDIS_PREFIX || 'integropia:'
  }
};
  

development.js


export default {
  app: {
    port: 3001,
    apiBaseUrl: 'BaseUrl that you recive',
    useMockUsername: 'true',
    mockUsername: process.env.MOCK_USERNAME || '',
  },
  db: {
    url: process.env.DB_URL || 'postgresql:postgressName',
    useSSL: 'false',
  },
  redis: {
    host: process.env.REDIS_HOST || '87.248.137.22',
    port: process.env.REDIS_PORT || 6379,
    sentinelNodes: process.env.REDIS_SENTINEL_NODES || '',
    sentinelName: process.env.REDIS_SENTINEL_MASTER || 'mymaster',
    password: process.env.REDIS_PASSWORD || 'password',
    dbNo: process.env.REDIS_DB_NO || 0,
    prefix: process.env.REDIS_PREFIX || 'integropia:',
  },
};
  

.dev.js


export default {
  app: {
    port: 3000,
    apiBaseUrl: process.env.API_BASE_URL || 'url',
    ssoBaseUrl: 'url,
    paymentBaseUrl: process.env.PAYMENT_BASE_URL || 'url',
    useMockUsername: process.env.USE_MOCK_USERNAME || 'false',
    mockUsername: process.env.MOCK_USERNAME || '',
  },
  db: {
    url: process.env.DB_URL || 'postgresql:postgress',
    useSSL: process.env.DB_USE_SSL || 'false',
  },
  redis: {
    host: process.env.REDIS_HOST || 'host',
    port: process.env.REDIS_PORT || port,
    sentinelNodes: process.env.REDIS_SENTINEL_NODES || '',
    sentinelName: process.env.REDIS_SENTINEL_MASTER || 'mymaster',
    password: process.env.REDIS_PASSWORD || 'password',
    dbNo: process.env.REDIS_DB_NO || 0,
    prefix: process.env.REDIS_PREFIX || 'integropia:'
  }
};
  

نکته بسیار مهم: در این بخش باید secret_key مینی‌اپ فرانت خود را در فایل‌های production.js یا development.js قرار دهید و نام مینی‌اپ در تمام پیکربندی‌ها یکسان باشد.