Maison  >  Article  >  interface Web  >  Organiser une application Node.js et Express.js prête pour la production

Organiser une application Node.js et Express.js prête pour la production

DDD
DDDoriginal
2024-10-11 10:42:30256parcourir

프로덕션에 즉시 사용 가능한 Node.js 및 Express.js 애플리케이션을 개발할 때는 명확하고 확장 가능한 폴더 구조를 유지하는 것이 중요합니다. 다음은 향상된 가독성과 관리를 위해 애플리케이션 구성 요소를 구성하는 src 디렉토리 아래에 권장되는 디렉토리 레이아웃입니다.

Organizing a Production-Ready Node.js and Express.js Application

내 앱/
├── src/
│ ├── 구성/
│ │ ├── db.js # 데이터베이스 연결 구성
│ │ ├── appConfig.js # 애플리케이션별 구성 설정
│ │ └── jwtConfig.js # JWT 비밀번호 및 인증 옵션
│ ├── 컨트롤러/
│ │ ├── userController.js # 사용자 관련 엔드포인트를 위한 컨트롤러
│ │ ├── productController.js # 제품 관련 엔드포인트를 위한 컨트롤러
│ │ └── authController.js # 인증 관련 엔드포인트 컨트롤러
│ ├── 미들웨어/
│ │ ├── authMiddleware.js # JWT 토큰 검증을 위한 미들웨어
│ │ ├── errorHandler.js # 중앙 집중식 오류 처리 미들웨어
│ │ └── loggerMiddleware.js # 요청 로깅을 위한 미들웨어
│ ├── 모델/
│ │ ├── userModel.js # 사용자 데이터 모델(스키마)
│ │ └── productModel.js # 제품 데이터 모델(스키마)
│ ├── 노선/
│ │ ├── userRoutes.js # 사용자 관련 작업을 위한 경로
│ │ ├── productRoutes.js # 제품 관련 작업을 위한 경로
│ │ └── authRoutes.js # 인증 경로
│ ├── 서비스/
│ │ ├── userService.js # 사용자 관련 작업을 위한 비즈니스 로직
│ │ ├── productService.js # 제품 관련 작업을 위한 비즈니스 로직
│ │ └── authService.js # 인증을 위한 비즈니스 로직
│ ├── utils/
│ │ ├── logger.js # 메시지 로깅을 위한 로거 유틸리티
│ │ ├── dateFormatter.js # 날짜 형식 지정 유틸리티
│ │ └── responseFormatter.js # 일관된 API 응답을 위한 유틸리티
│ ├── 테스트/
│ │ ├── 컨트롤러/ # 컨트롤러에 대한 단위 테스트
│ │ │ ├── userController.test.js
│ │ │ └── productController.test.js
│ │ ├── services/ # 서비스 단위 테스트
│ │ │ ├── userService.test.js
│ │ │ └── productService.test.js
│ │ └── models/ # 모델 단위 테스트
│ │ ├── userModel.test.js
│ │ └── productModel.test.js
│ ├── .env # 환경변수
│ ├── .gitignore # git에서 무시할 파일 및 폴더
│ ├── README.md # 프로젝트 문서
│ ├── package.json # NPM 패키지 매니페스트
│ └── server.js # 애플리케이션의 주요 진입점
├── .env # 환경변수
├── .gitignore # git에서 무시할 파일 및 폴더
├── README.md # 프로젝트 문서
├── package.json # NPM 패키지 매니페스트
└── package-lock.json # NPM 종속성의 정확한 버전

폴더/파일별 세부 분류

1. src/config/

db.js: 데이터베이스(MongoDB, PostgreSQL 등)에 연결하기 위한 구성입니다.
appConfig.js: 서버 포트 또는 애플리케이션 이름과 같은 애플리케이션에 대한 일반 구성 설정입니다.
jwtConfig.js: 인증을 위한 JSON 웹 토큰과 관련된 비밀 키 및 설정이 포함되어 있습니다.

2. src/컨트롤러/

userController.js: 사용자 관련 HTTP 요청(예: 등록, 사용자 데이터 가져오기)을 처리하는 기능이 포함되어 있습니다.
productController.js: 제품 관련 HTTP 요청을 처리하는 기능이 포함되어 있습니다.
authController.js: 인증 프로세스(로그인, 로그아웃 등)를 처리합니다.

3. src/미들웨어/

authMiddleware.js : Middleware pour authentifier les utilisateurs via JWT. Cela vérifie si une demande provient d'un utilisateur authentifié.
errorHandler.js : middleware centralisé de gestion des erreurs qui capture les erreurs et envoie une réponse formatée.
loggerMiddleware.js : Enregistre les demandes entrantes et autres événements importants à des fins de surveillance.

4. src/modèles/

userModel.js : Définit le schéma et le modèle pour les données utilisateur, généralement en utilisant Mongoose pour MongoDB.
productModel.js : Définit le schéma et le modèle pour les données produit.

5. src/routes/

userRoutes.js : Contient les itinéraires liés aux opérations des utilisateurs (par exemple, l'inscription, la gestion du profil).
productRoutes.js : Contient les itinéraires liés aux opérations du produit.
authRoutes.js : contient des routes spécifiquement pour l'authentification.

6. src/services/

userService.js : Contient la logique métier liée aux opérations des utilisateurs, la séparant des contrôleurs.
productService.js : Contient la logique métier liée aux opérations du produit.
authService.js : gère la logique d'authentification, y compris la génération et la validation des jetons.

7. src/utils/

logger.js : Utilitaire pour enregistrer les messages et les erreurs de manière cohérente dans toute l'application.
dateFormatter.js : Une fonction utilitaire pour formater les objets date.
responseFormatter.js : Standardise les réponses de l'API pour plus de cohérence.

8. src/tests/

controllers/: Contient des tests unitaires pour chaque contrôleur afin de garantir qu'il traite correctement les requêtes.
services/ : Contient des tests unitaires pour les fonctions de service afin de vérifier la logique métier.
models/ : Contient des tests pour les validations et les fonctionnalités des modèles.

9. Fichiers racine

.env : Stockez des informations sensibles telles que les clés API, les informations d'identification de la base de données et d'autres variables d'environnement.
.gitignore : Spécifiez les fichiers et répertoires qui ne doivent pas être suivis par Git (par exemple, node_modules, .env).
README.md : Documentation sur le projet, comment le configurer, instructions d'utilisation et toute autre information pertinente.
package.json : Répertorie les dépendances, les scripts et les métadonnées du projet.
package-lock.json : Verrouille les versions de dépendances pour garantir des installations cohérentes.
server.js : Le point d'entrée de l'application, où vous initialisez le serveur Express et le middleware.

Exemple de mise en œuvre de fichiers clés

src/config/db.js

//src/config/db.js
`const mangouste = require('mangouste');
const config = require('./appConfig');

const connectDB = async () => {
essayez {
attendre mangouste.connect(config.MONGODB_URI, {
useNewUrlParser : vrai,
useUnifiedTopology : vrai,
});
console.log('MongoDB connecté avec succès');
} attraper (erreur) {
console.error('Échec de la connexion MongoDB :', error.message);
processus.exit(1);
>
};
module.exports = connectDB;`

src/middleware/authMiddleware.js

// src/middleware/authMiddleware.js
`const jwt = require('jsonwebtoken');
const config = require('../config/jwtConfig');

const authMiddleware = (req, res, next) => {
const token = req.headers['autorisation'];
si (!token) {
return res.status(403).json({ message : 'Accès refusé. Aucun jeton fourni.' });
>

essayez {
const décodé = jwt.verify(token, config.JWT_SECRET);
req.user = décodé;
suivant();
} attraper (erreur) {
return res.status(401).json({ message : 'Jeton invalide.' });
>
};

module.exports = authMiddleware;`

src/server.js

//src/server.js
` const express = require('express');

const mongoose = require('mongoose');
const dotenv = require('dotenv');
const connectDB = require('./config/db');
const userRoutes = require('./routes/userRoutes');
const ProductRoutes = require('./routes/productRoutes');
const authRoutes = require('./routes/authRoutes');
const errorHandler = require('./middleware/errorHandler');
dotenv.config(); // 从 .env 文件加载环境变量
const app = express();
const PORT = process.env.PORT || 3000;
// 连接数据库
connectDB();
// 中间件
app.use(express.json()); // 解析传入的 JSON 请求
// 路线
app.use('/api/users', userRoutes);
app.use('/api/products', ProductRoutes);
app.use('/api/auth', authRoutes);
// 错误处理中间件
app.use(errorHandler);
// 启动服务器
app.listen(PORT, () => {
console.log(服务器正在 http://localhost:${PORT} 上运行);
});`

结论

通过采用这种结构化方法在 src 目录下组织 Node.js 和 Express.js 应用程序,您可以创建一个易于维护和扩展的生产就绪项目。该组织可以分离问题并提高清晰度,从而随着应用程序的增长实现更好的协作和开发实践。确保为健壮的应用程序实施单元测试、错误处理、日志记录和适当的环境管理。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn