使用 Express.js 开发 Node.js 应用程序时,有效构建代码库对于可维护性、可扩展性和易于协作至关重要。组织良好的项目结构使您能够管理复杂性,从而更轻松地导航和理解代码。在本博客中,我们将探索 Express.js 应用程序的典型文件夹结构,并解释每个目录和文件的用途。
项目结构概述
以下是 Express.js 应用程序的常见文件夹结构:
? ├── ? app.js ├── ? bin ├── ? config ├── ? controllers │ ├── ? customer.js │ ├── ? product.js │ └── ... ├── ? middleware │ ├── ? auth.js │ ├── ? logger.js │ └── ... ├── ? models │ ├── ? customer.js │ ├── ? product.js │ └── ... ├── ? routes │ ├── ? api.js │ ├── ? auth.js │ └── ... ├── ? public │ ├── ? css │ ├── ? js │ ├── ? images │ └── ... ├── ? views │ ├── ? index.ejs │ ├── ? product.ejs │ └── ... ├── ? tests │ ├── ? unit │ ├── ? integration │ ├── ? e2e │ └── ... ├── ? utils │ ├── ? validation.js │ ├── ? helpers.js │ └── ... └── ? node_modules
各目录和文件说明
应用程序.js
app.js 文件是应用程序的入口点。您可以在其中初始化 Express 应用程序、设置中间件、定义路由并启动服务器。将其视为 Web 应用程序的控制中心。
const express = require('express'); const app = express(); const config = require('./config'); const routes = require('./routes'); // Middleware setup app.use(express.json()); // Routes setup app.use('/api', routes); // Start server const PORT = config.port || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); }); module.exports = app;
垃圾桶
bin 目录通常包含用于启动 Web 服务器的脚本。这些脚本可用于设置环境变量或管理不同的环境(例如开发、生产)。
示例:bin/www
#!/usr/bin/env node const app = require('../app'); const debug = require('debug')('your-app:server'); const http = require('http'); const port = normalizePort(process.env.PORT || '3000'); app.set('port', port); const server = http.createServer(app); server.listen(port); server.on('error', onError); server.on('listening', onListening); function normalizePort(val) { const port = parseInt(val, 10); if (isNaN(port)) return val; if (port >= 0) return port; return false; } function onError(error) { if (error.syscall !== 'listen') throw error; const bind = typeof port === 'string' ? 'Pipe ' port : 'Port ' port; switch (error.code) { case 'EACCES': console.error(bind ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind ' is already in use'); process.exit(1); break; default: throw error; } } function onListening() { const addr = server.address(); const bind = typeof addr === 'string' ? 'pipe ' addr : 'port ' addr.port; debug('Listening on ' bind); }
配置
config 目录保存应用程序的配置文件,例如数据库连接、服务器设置和环境变量。
示例:config/index.js
module.exports = { port: process.env.PORT || 3000, db: { host: 'localhost', port: 27017, name: 'mydatabase' } };
控制器
控制器包含处理传入请求和生成响应的逻辑。控制器目录中的每个文件通常对应于应用程序的不同部分(例如客户、产品)。
示例:controllers/customer.js
const Customer = require('../models/customer'); exports.getAllCustomers = async (req, res) => { try { const customers = await Customer.find(); res.json(customers); } catch (err) { res.status(500).json({ message: err.message }); } };
中间件
中间件功能用于在请求到达控制器之前对其进行处理。它们可以处理身份验证、日志记录和请求验证等任务。
示例:middleware/auth.js
module.exports = (req, res, next) => { const token = req.header('Authorization'); if (!token) return res.status(401).json({ message: 'Access Denied' }); try { const verified = jwt.verify(token, process.env.JWT_SECRET); req.user = verified; next(); } catch (err) { res.status(400).json({ message: 'Invalid Token' }); } };
模型
模型定义数据的结构并处理与数据库的交互。每个模型文件通常对应于不同的数据实体(例如,客户、产品)。
示例:models/customer.js
const mongoose = require('mongoose'); const customerSchema = new mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('Customer', customerSchema);
路线
路由定义了应用程序不同部分的路径并将它们映射到适当的控制器。
示例:routes/api.js
const express = require('express'); const router = express.Router(); const customerController = require('../controllers/customer'); router.get('/customers', customerController.getAllCustomers); module.exports = router;
民众
公共目录包含直接向客户端提供服务的静态文件,例如 CSS、JavaScript 和图像。
示例:目录结构
public/ ├── css/ ├── js/ ├── images/
观看次数
视图是为客户端呈现 HTML 的模板。使用 EJS、Pug 或 Handlebars 等模板引擎,您可以生成动态 HTML。
示例:views/index.ejs
My App Welcome to My App
测试
测试目录包含测试文件,以确保您的应用程序正常工作。测试通常分为单元测试、集成测试和端到端 (e2e) 测试。
示例:目录结构
tests/ ├── unit/ ├── integration/ ├── e2e/
实用程序
实用函数和辅助模块存储在 utils 目录中。这些函数执行整个应用程序中使用的常见任务,例如验证和格式化。
示例:utils/validation.js
exports.isEmailValid = (email) => { const re = /^[^\s@] @[^\s@] \.[^\s@] $/; return re.test(String(email).toLowerCase()); };
节点模块
node_modules 目录包含您的项目所需的所有依赖项。该目录由 npm(或yarn)管理,包含从 npm 注册表安装的包。
结论
使用 Express.js 的结构良好的 Node.js 应用程序可以增强可维护性、可扩展性和协作性。结构中的每个目录和文件都有特定的用途,从处理配置和定义路由到管理中间件和渲染视图。通过有效地组织代码库,您可以轻松构建强大且可扩展的应用程序。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3