記錄nodejs使用express搭建一個api服務器程序(4)-Router api路由路徑匹配與響應

此文章是我自己用來記錄如何搭建一個以express爲基礎的api服務器框架的過程,並不是什麼新手教程,並不會每一步都寫得非常詳細,如果您要閱讀此文,需要一點nodejs和編寫代碼的基礎知識

文接上篇 鏈接: 地址 https://blog.csdn.net/goodboy31985/article/details/106242299
在上文基礎上,修改和完善api服務器的框架

使用express.Router來匹配不同的路徑

服務器需要處理不同的請求,通常不同的請求都是通過不同的路徑來處理的,比如,要獲取某個用戶的信息,就是這個api
http://xxx.xxx.x.x.x/api/users/1344
這樣就可以獲取到id爲1344的用戶的信息
或者是要獲取所有書籍的目錄,就是這個api
http://xxx.xxx.x.x.x/api/books/all

服務器如何區分和匹配不同的路徑,就可以通過Router來實現
我們在服務器的啓動代碼中 引入Router
在前幾節中,我們已經創建了一個app,並且監聽了某個端口,現在來創建路由
新建一個Routers.ts的文件,來統一管理我們的路由路徑
在這裏插入圖片描述

// ApiServer/Routers.ts

import express from "express";

export class Routers
{
    apiRouter = express.Router();
    PathRouter()
    {
    	
    }
}

注意,以上的代碼並不完整,現在我們只是創建了一個路由,並未進行路徑的匹配,PathRouter()方法暫時是空的

接下來,我們在ApiSever中使用它
在這裏插入圖片描述
我們首先創建了一個對象 router,並調用其PathRouter方法(此時此方法暫時爲空),使用 this.app.use(’/api’,router.apiRouter) 語句,將所有以 /api 爲開頭的路徑,全部由我們剛剛創建的路由對象來處理
現在其實我們還沒有匹配任何的路徑,接下來我們來匹配具體的路徑

匹配具體的路徑

現在我們在項目中增加一個文件夾和2個文件
在這裏插入圖片描述
Controller表示具體的事物處理類,真正執行具體的任務代碼
Routers.ts來負責進行路徑的分配
首先,我們來完善PathRouter

// ApiServer/Routers.ts

import express from "express";
import { UserController } from "../Controller/UserController";
import { BookController } from "../Controller/BookController";

export class Routers
{
    apiRouter = express.Router();

    PathRouter()
    {
        
        // api/users/
        this.apiRouter.get('/users/:id', UserController.UserInfo);


        // api/books/
        this.apiRouter.get('/books/all',BookController.GetAllBooks)


        // api/orders/
        //this.apiRouter.use('/orders')
    }

}

PathRouter()中新增的這兩行代碼,就是具體的路徑匹配了,其實完整的路徑應該是 /api/users/xxxx,由於我們在ApiServer的代碼中已經全局匹配了/api,所以這裏的/api需要省略掉
在這裏插入圖片描述
這個語句中的第二個參數,就是對應的路徑的處理函數(或者叫做中間件,我們現在的代碼只有這1層中間件,實際中我們可以配置多箇中間件,數據會被一層一層逐次處理,這部分內容在後面的文章中進行補充)

Controller/BookController.ts 的內容

// Controller/BookController.ts

import { Request, Response, NextFunction } from 'express'


export class BookController
{
    // GET books/all
    static GetAllBooks(req: Request, res: Response, next: NextFunction)
    {
        console.log("receive a GET request");
        console.log('[', req.method, '][', req.originalUrl, ']');
        console.log(req.params);

        let books = [
            { id: 1, name: "1" },
            { id: 2, name: "2" },
            { id: 3, name: "3" },
            { id: 4, name: "4" },
        ]

        return res.json(books).end();
    }
}

Controller/UserController.ts的內容

// Controller/UserController.ts

import { Request, Response, NextFunction } from 'express'

export class UserController
{
    // GET users/:id
    static UserInfo(req: Request, res: Response,next:NextFunction)
    {
        let user = req.params;
        console.log("receive a GET request");
        console.log('[', req.method, '][', req.originalUrl, ']');
        console.log(req.params);
        
        return res.json(req.params).end();
    }
}

處理函數分析

// GET users/:id
    static UserInfo(req: Request, res: Response,next:NextFunction)
    {
        let user = req.params;
        console.log("receive a GET request");
        console.log('[', req.method, '][', req.originalUrl, ']');
        console.log(req.params);
        
        return res.json(req.params).end();
    }

這個函數中有3個參數,req res 和 next
req表示請求的信息,包括請求的來源,參數等等具體需要參考文檔 鏈接: 鏈接 https://www.expressjs.com.cn/4x/api.html#req

res表示返回的數據
鏈接: 鏈接 https://www.expressjs.com.cn/4x/api.html#res

next表示下一個中間件,如果有多箇中間件的話,可以調用next(),然後數據會交由下一個中間件處理

路徑上的參數

通常有幾種方式來傳遞請求的參數

  1. http://x.x.x.x/api/users/:id/:age
    這種方式,我們在客戶端發起的請求地址是這樣的
    http://x.x.x.x/api/users/1/23
    實際匹配的路徑爲 /api/users 後面的 /1/23 其實是參數
    通過req.params 來獲取
    比如我現在運行我們剛剛的服務器代碼
    在這裏插入圖片描述
    我們通過瀏覽器,向服務器發送get請求
    在這裏插入圖片描述
    在這裏插入圖片描述
    輸出的日誌爲
    在這裏插入圖片描述
    這裏已經獲取到參數 id:1 了
    最後我將這個參數又返回給了客戶端

  2. http://x.x.x.x/api/users?id=1&age=23
    這種方式,我們在客戶端發起的請求地址是這樣的
    http://x.x.x.x/api/users?id=1&age=23
    實際匹配的路徑爲 /api/users 後面的?id=1&age=23是參數
    通過req.query 來獲取
    例如
    在這裏插入圖片描述
    處理這個請求
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    這裏由於是通過?id=xxx 這樣的形式傳遞的參數,通過req.params 無法獲取到,需要通過req.query 來獲取

  3. 通過post請求發送參數
    這個在以後的文章中再討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章