此文章是我自己用來記錄如何搭建一個以express爲基礎的api服務器框架的過程,並不是什麼新手教程,並不會每一步都寫得非常詳細,如果您要閱讀此文,需要一點nodejs和編寫代碼的基礎知識
文接上篇 鏈接: 地址 https://blog.csdn.net/goodboy31985/article/details/106242299
在上文基礎上,修改和完善api服務器的框架
Router 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(),然後數據會交由下一個中間件處理
路徑上的參數
通常有幾種方式來傳遞請求的參數
-
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 了
最後我將這個參數又返回給了客戶端 -
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 來獲取 -
通過post請求發送參數
這個在以後的文章中再討論