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

راهاندازی پروژه بکاند (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
قرار دهید و نام مینیاپ در تمام پیکربندیها یکسان باشد.
No Comments