首页 > 其他分享 >express常见的规范以及各模块的作用与使用方式

express常见的规范以及各模块的作用与使用方式

时间:2024-10-25 23:20:00浏览次数:8  
标签:const require express +---------------------+ 规范 js 模块 app port

+---------------------+       +---------------------+       +---------------------+
|      app.js         |<----->|     routes/         |<----->|   controllers/       |
+---------------------+       +---------------------+       +---------------------+
        ^                       ^                       ^
        |                       |                       |
        v                       v                       v
+---------------------+       +---------------------+       +---------------------+
|     config/         |       |   middlewares/      |       |     services/        |
+---------------------+       +---------------------+       +---------------------+
        ^                       ^                       ^
        |                       |                       |
        v                       v                       v
+--------------------------------------------------------------------------+
                                |
                                v
                        +---------------------+
                        |     models/         |
                        +---------------------+
                                |
                                v
                        +---------------------+
                        |     utils/          |
                        +---------------------+

在Express框架中进行模块化开发可以提高代码的可维护性和可扩展性。以下是一些常见的规范以及各模块的作用与使用方式:

1. 项目结构

一个典型的Express项目结构可能如下:

myapp/
├── app.js
├── bin/
│   └── www
├── config/
│   ├── db.js
│   └── config.js
├── controllers/
│   ├── userController.js
│   └── postController.js
├── middlewares/
│   ├── auth.js
│   └── logger.js
├── models/
│   ├── userModel.js
│   └── postModel.js
├── routes/
│   ├── userRoutes.js
│   └── postRoutes.js
├── services/
│   ├── userService.js
│   └── postService.js
└── utils/
    ├── helpers.js
    └── constants.js

2. 模块作用与使用方式

app.js
  • 作用: 应用的入口文件,配置全局中间件、路由等。
  • 使用方式:
    const express = require('express');
    const app = express();
    const bodyParser = require('body-parser');
    
    // 使用中间件
    app.use(bodyParser.json());
    
    // 引入路由
    const userRoutes = require('./routes/userRoutes');
    app.use('/api/users', userRoutes);
    
    module.exports = app;
    
bin/www
  • 作用: 启动服务器。
  • 使用方式:
    #!/usr/bin/env node
    
    const app = require('../app');
    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', one rror);
    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 one rror(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;
      console.log('Listening on ' + bind);
    }
    
config/
  • 作用: 存放配置文件,如数据库连接、环境变量等。
  • 使用方式:
    // config/db.js
    const mongoose = require('mongoose');
    
    const connectDB = async () => {
      try {
        await mongoose.connect(process.env.MONGO_URI, {
          useNewUrlParser: true,
          useUnifiedTopology: true,
        });
        console.log('MongoDB connected');
      } catch (err) {
        console.error(err.message);
        process.exit(1);
      }
    };
    
    module.exports = connectDB;
    
controllers/
  • 作用: 处理业务逻辑,调用服务层,返回响应。
  • 使用方式:
    // controllers/userController.js
    const userService = require('../services/userService');
    
    exports.getUsers = async (req, res) => {
      try {
        const users = await userService.getUsers();
        res.json(users);
      } catch (err) {
        res.status(500).json({ message: err.message });
      }
    };
    
middlewares/
  • 作用: 自定义中间件,如身份验证、日志记录等。
  • 使用方式:
    // middlewares/auth.js
    const jwt = require('jsonwebtoken');
    
    const auth = (req, res, next) => {
      const token = req.header('x-auth-token');
      if (!token) return res.status(401).json({ message: 'Access denied. No token provided.' });
    
      try {
        const decoded = jwt.verify(token, 'your_jwt_secret');
        req.user = decoded;
        next();
      } catch (ex) {
        res.status(400).json({ message: 'Invalid token.' });
      }
    };
    
    module.exports = auth;
    
models/
  • 作用: 定义数据模型,通常与数据库交互。
  • 使用方式:
    // models/userModel.js
    const mongoose = require('mongoose');
    
    const userSchema = new mongoose.Schema({
      name: String,
      email: { type: String, unique: true },
      password: String,
    });
    
    module.exports = mongoose.model('User', userSchema);
    
routes/
  • 作用: 定义路由,将请求映射到控制器。
  • 使用方式:
    // routes/userRoutes.js
    const express = require('express');
    const router = express.Router();
    const userController = require('../controllers/userController');
    const auth = require('../middlewares/auth');
    
    router.get('/users', auth, userController.getUsers);
    
    module.exports = router;
    
services/
  • 作用: 处理业务逻辑,调用模型层,进行数据处理。
  • 使用方式:
    // services/userService.js
    const User = require('../models/userModel');
    
    exports.getUsers = async () => {
      return await User.find();
    };
    
utils/
  • 作用: 存放工具函数和常量。
  • 使用方式:
    // utils/helpers.js
    exports.formatDate = (date) => {
      return date.toISOString().split('T')[0];
    };
    

总结

通过模块化开发,可以将不同的功能分离到不同的文件和目录中,使得代码更加清晰、易于维护。每个模块都有明确的职责,便于团队协作和代码复用。

标签:const,require,express,+---------------------+,规范,js,模块,app,port
From: https://blog.csdn.net/qq_43984101/article/details/143225448

相关文章

  • Python编码规范
        为什么不直接进入Python的语法和数据类型阶段,而是介绍Python编码规范?因为这很重要!作为一个开发的老鸟,给新人的第一个建议就是Python编码规范,这种规范很多时候不仅仅是Python,祝大家养成良好的代码习惯!~~~~一.忽略代码规范的规则以下情况可以忽略代码规范,其余情况请尽量......
  • ESModule模块化开发
    认识ESModule◼JavaScript没有模块化一直是它的痛点,所以才会产生我们前面学习的社区规范:CommonJS、AMD、CMD等,所以在ECMA推出自己的模块化系统时,大家也是兴奋异常。◼ESModule和CommonJS的模块化有一些不同之处:一方面它使用了import和export关键字;另一方面它采用编......
  • java中变量的命名规范是?
    一、在Java中,变量的命名规范有助于提高代码的可读性和可维护性。以下是一些主要的命名规范:小驼峰命名法(camelCase)变量名的第一个单词首字母小写,后续单词的首字母大写。例如:firstName,totalAmount,isAvailable避免使用单字母命名除非在非常简单的情况下(如循环计数器),......
  • 基于CC3301芯片的双模WiFi模块E103-W13产品说明
    E103-W13系列WiFi6+蓝牙5.4协议双模WiFi模块E103-W13是基TI第十代Combo芯片CC3301推出一款2.4GHz工作频段Wi-Fi 6协议+低功耗蓝牙5.4协议的双模Wi-Fi模块。该双模蓝牙WiFi模块内部集成2.4GHz工作频段+PA,适用于输出功率高达+21dBm的完整无线解决方案,并且还可以与TI Sitara M......
  • JavaScript模块化开发
    什么是模块化?◼到底什么是模块化、模块化开发呢?事实上模块化开发最终的目的是将程序划分成一个个小的结构;这个结构中编写属于自己的逻辑代码,有自己的作用域,定义变量名词时不会影响到其他的结构;这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用;也可......
  • 数据库设计过程中,除了3NF,还有哪些其他规范化形式?
    在数据库设计过程中,除了第三范式(3NF)外,还有其他几种重要的规范化形式,它们旨在进一步减少数据冗余和提高数据一致性。以下是对这些规范化形式的详细解释:第一范式(1NF):定义:确保每列都是不可分割的基本数据项,即表中不能再包含表(或称为列表),且表中的每一行都是唯一的(通过主键或其他......
  • 基于surging的木舟平台如何上传模块热部署
    一、概述      通过3个月的赶工,基本上快完成1.0版本的研发,将在下个月发布社区1.0版本。      木舟(Kayak)是什么?      木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的,平台包含了微服务和物联网平台。支持异步和响应式编程开发,功......
  • 第十一章 TypeScript模块和命名空间的介绍和使用
    文章目录一、模块1.导出基础导出重新导出导出重命名2.导入基础导入导入重命名3.默认导出4.模块化兼容exports=import=require('')编译结果二、命名空间1.例子2.命名空间3.引入命名空间三、模块和命名空间一、模块JavaScript在ES2015中引入了模块......
  • Python 文件与模块的运行顺序及调用时的执行流程详解【大白话版本!!】
    Python文件与模块的运行顺序及调用执行流程详解引言ython是一种强大的编程语言,具有极大的灵活性和简洁性。无论是在开发小型脚本,还是构建复杂的应用程序时,理解Python文件的运行顺序以及模块调用时的执行流程都至关重要。尤其当你开发大规模项目,涉及到多个模块(文件)之间......
  • 【神兵利器】——199、Burpsuite之请求重发模块
    基本介绍Burpsuite为渗透测试人员提供了请求重发的功能模块,渗透测试人员可以对捕获到的历史报文中的数据进行多次的更改进行Fuzzing尝试来对网站进行安全评估,同一个报文可以进行N次更改与重复测试评估,同时在最新的Burpsuite版本中提供了将多个请求组合放到一个请求包中进行发......