后端框架模塊化

后端框架的模塊化設計旨在簡化開發流程、提高可維護性,并通過分層解耦降低復雜性。以下是常見的后端模塊及其在不同語言(Node.js、Java、Python)中的實現方式:

目錄

      • 1. 路由(Routing)
      • 2. 中間件(Middleware)
      • 3. 數據庫與ORM(models)
      • 4. 遷移(Migration)
      • 5. 服務層(Service Layer)
      • 6. 配置管理(Configuration)
      • 7. 依賴注入(DI)
      • 8. 測試模塊(Testing)
      • 9. 安全模塊(Security)
      • 10. 日志(Logging)


1. 路由(Routing)

作用:將 HTTP 請求映射到對應的處理函數或控制器。

  • Node.js (Express)
    const express = require('express');
    const router = express.Router();
    router.get('/users', (req, res) => { /* 處理邏輯 */ });
    
  • Java (Spring Boot)
    使用注解定義路由:
    @RestController
    public class UserController {@GetMapping("/users")public List<User> getUsers() { /* 處理邏輯 */ }
    }
    
  • Python (Flask)
    from flask import Flask
    app = Flask(__name__)
    @app.route('/users', methods=['GET'])
    def get_users(): return "User List"
    

2. 中間件(Middleware)

作用:在請求和響應之間插入處理邏輯(如鑒權、日志)。

  • Node.js (Express)
    app.use((req, res, next) => {console.log('Request received');next(); // 傳遞到下一個中間件
    });
    
  • Java (Spring Boot)
    通過 FilterInterceptor
    @Component
    public class LoggingFilter implements Filter {public void doFilter(..., FilterChain chain) {System.out.println("Request received");chain.doFilter(request, response);}
    }
    
  • Python (Django)
    class LoggingMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):print("Request received")return self.get_response(request)
    

3. 數據庫與ORM(models)

作用:管理數據庫連接、操作數據,ORM(對象關系映射)將數據庫表映射為對象。

  • Node.js (Sequelize)
    const { Sequelize, Model } = require('sequelize');
    class User extends Model {}
    User.init({ name: Sequelize.STRING }, { sequelize });
    
  • Java (Hibernate)
    使用 JPA 注解:
    @Entity
    @Table(name = "users")
    public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;
    }
    
  • Python (SQLAlchemy)
    from sqlalchemy import Column, Integer, String
    class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)
    

4. 遷移(Migration)

作用:管理數據庫結構變更(如新增表、修改字段)。

  • Node.js (Knex)
    創建遷移文件并運行:
    knex migrate:make create_users_table
    knex migrate:latest
    
  • Java (Flyway)
    src/main/resources/db/migration 下編寫 SQL 文件(如 V1__Create_users_table.sql),Flyway 自動執行。
  • Python (Alembic)
    alembic revision --autogenerate -m "Create users table"
    alembic upgrade head
    

5. 服務層(Service Layer)

作用:封裝業務邏輯,與控制器(Controller)和數據庫層解耦。

  • Node.js (NestJS)
    @Injectable()
    export class UserService {constructor(private userRepository: UserRepository) {}async getUsers() { return this.userRepository.find(); }
    }
    
  • Java (Spring Boot)
    @Service
    public class UserService {@Autowiredprivate UserRepository userRepository;public List<User> getUsers() { return userRepository.findAll(); }
    }
    
  • Python (Django)
    class UserService:def get_users(self):return User.objects.all()
    

6. 配置管理(Configuration)

作用:集中管理環境變量、數據庫連接等配置。

  • Node.js (dotenv)
    使用 .env 文件:
    DB_HOST=localhost
    
    代碼中讀取:
    require('dotenv').config();
    console.log(process.env.DB_HOST);
    
  • Java (Spring Boot)
    application.properties 中定義:
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    
  • Python (Flask)
    使用 config.py
    class Config:SQLALCHEMY_DATABASE_URI = 'sqlite:///app.db'
    

7. 依賴注入(DI)

作用:解耦組件依賴,提高可測試性。

  • Node.js (NestJS)
    通過裝飾器注入依賴:
    @Controller()
    export class UserController {constructor(private userService: UserService) {}
    }
    
  • Java (Spring Boot)
    使用 @Autowired 注解:
    @RestController
    public class UserController {@Autowiredprivate UserService userService;
    }
    
  • Python (FastAPI)
    通過函數參數注入:
    from fastapi import Depends
    def get_db():db = SessionLocal()try: yield dbfinally: db.close()@app.get("/users")
    def read_users(db: Session = Depends(get_db)):return db.query(User).all()
    

8. 測試模塊(Testing)

作用:自動化測試 API、服務邏輯和數據庫操作。

  • Node.js (Jest)
    test('GET /users returns 200', async () => {const res = await request(app).get('/users');expect(res.statusCode).toBe(200);
    });
    
  • Java (JUnit)
    @SpringBootTest
    class UserControllerTest {@Testvoid testGetUsers() {// 測試邏輯}
    }
    
  • Python (pytest)
    def test_get_users(client):response = client.get('/users')assert response.status_code == 200
    

9. 安全模塊(Security)

作用:處理身份驗證(Authentication)和授權(Authorization)。

  • Node.js (Passport.js)
    passport.use(new LocalStrategy((username, password, done) => {// 驗證用戶邏輯
    }));
    
  • Java (Spring Security)
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated();}
    }
    
  • Python (Django Auth)
    from django.contrib.auth.decorators import login_required
    @login_required
    def profile(request):return render(request, 'profile.html')
    

10. 日志(Logging)

作用:記錄應用運行狀態和錯誤信息。

  • Node.js (Winston)
    const logger = winston.createLogger({transports: [new winston.transports.Console()]
    });
    logger.info('Server started');
    
  • Java (Log4j)
    import org.apache.logging.log4j.LogManager;
    private static final Logger logger = LogManager.getLogger();
    logger.info("Server started");
    
  • Python (logging)
    import logging
    logging.basicConfig(level=logging.INFO)
    logging.info('Server started')
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MDG實現BP客商復雜邏輯校驗的方法

引言 項目中可能常用的增強點是USMD_RULE_SERVICE來實現復雜的校驗邏輯&#xff0c;除此之外&#xff0c;SAP對BP主數據還提供了以下的實現方式。 方法1-替換ERP校驗類 眾所周知&#xff0c;BP存在復雜的ERP校驗&#xff0c;主要通過類CL_MDG_BS_FND_BP_CHECK&#xff08;子…

基于springboot的教務系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 這些年隨著Internet的迅速發展&#xff0c;我們國家和世界都已經進入了互聯網大數據時代&#xff0c;計算機網絡已經成為了整個社會以及經濟發展的巨大動能&#xff0c;各個高校的教務工作成為了學校管理事務的重要目標和任務&#xff0c;因此運用互聯網技術來提高教務的…

TDengine 中的流式計算

簡介 TDengine 中的流計算&#xff0c;功能相當于簡化版的 FLINK &#xff0c; 具有實時計算&#xff0c;計算結果可以輸出到超級表中存儲&#xff0c;同時也可用于窗口預計算&#xff0c;加快查詢速度。 創建流式計算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…

代碼隨想錄day23 回溯part2

39.組合總和 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target &#xff0c;找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 &#xff0c;并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同一個 數字可以 無限制重…

回調函數中 qsort 函數的使用

目錄 一.冒泡排序 二.指針類型 void* 三. qsort 1.簡介 2.研究函數參數 3.怎么用&#xff1f; (1)排數組&#xff0c;升序 (2)排序結構體 四.用冒泡排序思想&#xff0c;模擬實現 qsort (可排序任意類型數據) 1.函數參數設計 2.在 if (cmp( )>0) 怎么傳參&#x…

電機控制常見面試問題(十四)

文章目錄 一.電機信噪比二.電機零點偏移校正和極對數自適應1.零點偏移量檢測?2. 極對數識別三.交流電機電流紋波怎么產生的1.電源相關因素2.電機本體特性3.?PWM逆變器諧波4.負載與環境干擾5.診斷流程建議 四.談談對諧波的理解1.諧波定義2.次諧波產生源3.次諧波的檢測與分析4.…

axios和fetch的對比

axios 和 fetch 是用于發起 HTTP 請求的兩種常見工具&#xff0c;它們的主要區別如下&#xff1a; 1. 瀏覽器兼容性 axios&#xff1a;基于 XMLHttpRequest&#xff0c;兼容性較好&#xff0c;支持較舊的瀏覽器&#xff08;如 IE11&#xff09;。fetch&#xff1a;現代瀏覽器…

Java Timer定時任務源碼分析

前言 Java 提供的java.util.Timer類可以用來執行延時任務&#xff0c;任務可以只執行一次&#xff0c;也可以周期性的按照固定的速率或延時來執行。 實現一個延時任務調度器&#xff0c;核心有兩點&#xff1a; 如何存儲延時任務如何調度執行延時任務 源碼分析 TimerTask …

【安全運營】用戶與實體行為分析(UEBA)淺析

目錄 用戶與實體行為分析&#xff08;UEBA&#xff09;簡介一、UEBA的核心概念1. 行為基線建立2. 異常檢測3. 風險評分4. 上下文關聯 二、UEBA的應用場景1. 內部威脅檢測2. 外部威脅應對3. 合規性和審計支持 三、UEBA的技術實現1. 大數據技術2. 機器學習算法3. 可視化工具 四、…

系統思考—啤酒游戲經營決策沙盤模擬

再次感謝文華學院的邀請&#xff0c;為經緯集團管理層帶來 《啤酒游戲經營決策沙盤》&#xff01; 很多朋友問&#xff1a;“最近是不是啤酒游戲上的少了&#xff1f;” 其實&#xff0c;真正的關鍵不是游戲本身&#xff0c;而是——如何讓大家真正看見復雜系統中的隱性結構。 …

排序算法實現:插入排序與希爾排序

目錄 一、引言 二、代碼整體結構 三、宏定義與頭文件 四、插入排序函數&#xff08;Insertsort&#xff09; 函數作用 代碼要點分析 五、希爾排序函數&#xff08;ShellSort&#xff09; 函數作用 代碼要點分析 六、打印數組函數&#xff08;PrintSort&#x…

redis的key是如何找到對應存儲的數據原理

在 Redis 中,Key 是數據的唯一標識符,而 Value 是與 Key 關聯的實際數據。Redis 通過高效的鍵值對存儲機制,能夠快速定位和訪問數據。以下是 Redis 如何通過 Key 找到對應存儲數據的詳細解析: 1. Redis 的數據存儲結構 Redis 是一個基于內存的鍵值存儲系統,其核心數據結構…

github上傳本地文件到遠程倉庫(空倉庫/已有文件的倉庫)

今天搞自己本地訓練的代碼到倉庫留個檔&#xff0c;結果遇到了好多問題&#xff0c;到騰了半天才搞明白整個過程&#xff0c;留在這里記錄一下。 遠程空倉庫 主要根據官方教程&#xff1a;Adding locally hosted code to GitHub - GitHub Docs #1. cd到你需要上傳的文件夾&a…

Redis數據類型詳解

Redis數據類型詳解 Redis 共有 5 種基本數據類型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 除了 5 種基本的數據…

【第13章】億級電商平臺訂單系統-高性能之異步架構設計

1-1 本章導學 課程導學 學習目標:掌握大型系統架構設計難點之高性能異步架構設計項目落地:訂單系統高性能異步架構設計(年交易200億B2B電商平臺)本章主要內容 1. 為何需要異步消息架構 分析同步架構的性能瓶頸異步架構對系統解耦與性能提升的核心價值2. 確定異步消息技術…

2025-03-20 學習記錄--C/C++-C 庫函數 - toupper()、tolower()、 isspace()

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、C 庫函數 - toupper() ?? C 標準庫 - <ctype.h> C 標準庫的 ctype.h 頭文件提供了一些函數&#xff0c;可用于測試和…

LoRaWAN技術解析

LoRaWAN&#xff08;Long Range Wide Area Network&#xff09;是一種基于 LoRa&#xff08;Long Range&#xff09;技術的低功耗廣域網絡協議&#xff0c;專為物聯網&#xff08;IoT&#xff09;設備的無線通信而設計。它是一種開放的、標準化的通信協議&#xff0c;支持大規模…

織夢DedeCMS如何獲得在列表和文章頁獲得頂級或上級欄目名稱

獲得頂級或二級欄目的名稱&#xff0c;都需要修改php文件&#xff0c;修改的文件【/include/common.func.php】將代碼插入到這個文件的最下面即可&#xff1b; 一、獲得當前文章或欄目的【頂級欄目】名稱 1、插入頂級欄目代段 //獲取頂級欄目名 function GetTopTypename($id…

虛幻基礎:ue自定義類

文章目錄 Gameplay Tag&#xff1a;ue標簽類創建&#xff1a;其他-數據表格-gameplaytag安裝&#xff1a;項目設置&#xff1a;gamePlayTag&#xff1a;gamePlay標簽列表使用&#xff1a;變量類型&#xff1a;gamePlayTag primary data asset&#xff1a;ue數據類&#xff1a;通…

易語言模擬真人鼠標軌跡算法

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序&#xff0c;它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言&#xff0c;原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢&#xff1a; 模擬…