标准nodejs项目工程
一个标准的 Node.js 项目通常包含以下结构和特点:
1. 目录结构
my-project/ ├── src/ # 源代码目录 │ ├── controllers/ # 控制器 │ ├── models/ # 数据模型 │ ├── routes/ # 路由定义 │ ├── middleware/ # 中间件 │ ├── services/ # 业务逻辑 │ ├── utils/ # 工具函数 │ └── app.js # 应用入口 ├── tests/ # 测试文件 ├── config/ # 配置文件 ├── node_modules/ # 依赖包(自动生成) ├── public/ # 静态资源 ├── docs/ # 文档 ├── .gitignore # Git 忽略文件 ├── package.json # 项目配置和依赖 ├── package-lock.json # 依赖版本锁定 └── README.md # 项目说明
2. 核心配置文件
package.json 示例
{"name": "my-project","version": "1.0.0","description": "A Node.js project","main": "src/app.js","scripts": {"start": "node src/app.js","dev": "nodemon src/app.js","test": "jest","lint": "eslint src/","build": "npm run lint && npm test"},"dependencies": {"express": "^4.18.0","mongoose": "^7.0.0","cors": "^2.8.5"},"devDependencies": {"nodemon": "^2.0.0","jest": "^29.0.0","eslint": "^8.0.0"},"keywords": ["nodejs", "express"],"author": "Your Name","license": "MIT"
}3. 入口文件示例
src/app.js
const express = require('express');
const cors = require('cors');
const config = require('./config');
const routes = require('./routes');const app = express();// 中间件
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));// 静态文件
app.use(express.static('public'));// 路由
app.use('/api', routes);// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).json({ error: 'Something went wrong!' });
});// 404 处理
app.use('*', (req, res) => {res.status(404).json({ error: 'Route not found' });
});const PORT = config.port || 3000;
app.listen(PORT, () => {console.log(`Server running on port ${PORT}`);
});module.exports = app;4. 模块化结构
路由示例 (src/routes/index.js)
const express = require('express');
const userController = require('../controllers/userController');const router = express.Router();router.get('/users', userController.getUsers);
router.post('/users', userController.createUser);
router.get('/users/:id', userController.getUserById);module.exports = router;控制器示例 (src/controllers/userController.js)
const userService = require('../services/userService');exports.getUsers = async (req, res, next) => {try {const users = await userService.getUsers();res.json(users);} catch (error) {next(error);}
};exports.createUser = async (req, res, next) => {try {const user = await userService.createUser(req.body);res.status(201).json(user);} catch (error) {next(error);}
};5. 环境配置
config/index.js
require('dotenv').config();module.exports = {port: process.env.PORT || 3000,database: {url: process.env.DATABASE_URL || 'mongodb://localhost:27017/myapp'},jwt: {secret: process.env.JWT_SECRET || 'your-secret-key'}
};.env 文件
PORT=3000 DATABASE_URL=mongodb://localhost:27017/myapp JWT_SECRET=your-jwt-secret NODE_ENV=development
6. 开发工具配置
.gitignore
node_modules/ .env *.log .DS_Store coverage/ dist/
ESLint 配置 (.eslintrc.js)
module.exports = {env: {node: true,es2021: true},extends: ['eslint:recommended'],parserOptions: {ecmaVersion: 12,sourceType: 'module'},rules: {'no-console': 'warn','no-unused-vars': 'error'}
};7. 测试结构
tests/user.test.js
const request = require('supertest');
const app = require('../src/app');describe('User API', () => {it('should get all users', async () => {const res = await request(app).get('/api/users').expect(200);expect(Array.isArray(res.body)).toBe(true);});
});8. 最佳实践
模块化:按功能拆分模块
错误处理:统一的错误处理机制
环境配置:区分开发和生产环境
日志记录:使用 winston 或 pino 等日志库
安全措施:helmet、cors、输入验证
代码规范:ESLint + Prettier
测试覆盖:单元测试和集成测试
文档:清晰的 README 和 API 文档
这样的结构确保了项目的可维护性、可扩展性和团队协作效率。
