亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node express路由如何使用

發布時間:2022-11-03 09:43:36 來源:億速云 閱讀:114 作者:iii 欄目:web開發

這篇文章主要介紹“Node express路由如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Node express路由如何使用”文章能幫助大家解決問題。

路由是指如何定義應用的端點(URIs)以及如何響應客戶端的請求。

路由是由一個 URIHTTP 請求(GETPOST等)和若干個句柄組成,它的結構如下:

app.METHOD(path, [callback...], callback)

  • appexpress 對象的一個實例

  • METHOD 是一個 HTTP 請求方法

  • path服務器上的路徑

  • callback 是當路由匹配時要執行的函數

1、基礎路由

先定義一個基礎的路由:

const express = require("express");

// app對象
const app = express();

app.get("/", (req, res) => {
    res.send("匹配/");
});

上面的例子表示的是一個路徑為/GET請求路由,即當用戶使用GET請求訪問/時會執行(req, res) =>{res.send("匹配/");}函數。

路由路徑請求方法一起定義了請求的端點:

// 匹配 / 路徑的get請求
app.get("/", (req, res) => {
    res.send("匹配 / 路徑的get請求");
});
// 匹配 / 路徑的post請求
app.post("/", (req, res) => {
    res.send("匹配 / 路徑的post請求");
});
// 匹配 / 路徑的put請求
app.put("/", (req, res) => {
    res.send("匹配 / 路徑的put請求");
});
// 匹配 / 路徑的delete請求
app.delete("/", (req, res) => {
    res.send("匹配 / 路徑的delete請求");
});

觀察上面的路由你會發現它們的請求路徑是一樣的,只是請求方式不同,這是允許的,因為相同路徑的請求只要請求方法不同最后就會進入到不同的處理函數中。

這種風格的寫法稱為RES Tful,在開發API接口中比較推薦使用

RES Tful特點包括:
1、每一個URI代表1種資源;
2、客戶端使用GET、POST、PUT、DELETE4個表示操作方式的動詞對服務端資源進行操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來刪除資源;
3、通過操作資源的表現形式來操作資源;
4、資源的表現形式是XML或者HTML;
5、客戶端與服務端之間的交互在請求之間是無狀態的,從客戶端到服務端的每個請求都必須包含理解請求所必需的信息。

2、路徑匹配

express的路由可以進行模糊匹配,這是因為express的路由路徑可以是字符串字符串模式或者正則表達式

字符串匹配

當路徑使用字符串時進行的就是普通的匹配,路徑是什么就匹配什么:

// 匹配根路徑的請求
app.get('/', function (req, res) {
  res.send('root');
});

// 匹配 /about 路徑的請求
app.get('/about', function (req, res) {
  res.send('about');
});

字符串模式匹配

在字符串的基礎上添加一些額外的語法(如下)稱為字符串模式

  • ? 表示可選

  • :id 表示使用id字段占位

  • + 表示可出現多次(至少一次)

  • * 表示任意

使用字符串模式的路徑:

// 匹配 /acd 和 /abcd:?前邊的字符代表可選
app.get("/ab?cd", function (req, res) {
    res.send("ok");
});

// 匹配 /ab/*******::id代表占位,這個id是自定義的(你也可以寫:aa,:bb等),之后能用來獲取/ab/后的參數
app.get("/ab/:id", function (req, res) {
    res.send("/ab/*******");
});

// 匹配 /abcd,/abbcd,/abbbcd等,+號前的字符可以連續出現多個
app.get("/ab+cd", function (req, res) {
    res.send("/ab+cd");
});

// 匹配 /abcd,/abxcd,/abBIHIHIcd,/ab1456cd等,*號代表任意字符
app.get("/ab*cd", function (req, res) {
    res.send("/ab*cd");
});

// 匹配 /abe,/abcde,可以使用括號包裹多個字符形成一個整體
app.get("/ab(cd)?e", function (req, res) {
    res.send("/ab(cd)?e");
});

正則匹配

express路由匹配中最強大的一點就是它能夠根據正則來進行匹配(雖然這在開發中用處不多)。

使用正則表達式的路由路徑:

// 匹配任何路徑中含有 a 的路徑:
app.get(/a/, function (req, res) {
    res.send("/a/");
});

// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function (req, res) {
    res.send("/.*fly$/");
});

3、處理函數

可以為請求處理提供多個回調函數,其行為類似 中間件

唯一的區別是這些回調函數有可能調用 next('route')next('router') 方法而略過其他路由回調函數。

多函數

使用多個回調函數處理路由(記得指定 next 對象):

// 直接添加多個回調函數
app.get(
    "/",
    (req, res, next) => {
        console.log("第一個執行");
        next();
    },
    (req, res, next) => {
        console.log("第二個執行");
        next();
        // next('route') next中添加route參數時會跳過之后的回調函數
    },
    (req, res) => {
        console.log("最后一個執行");
        // 返回數據內容
        res.send("home");
    }
);

調用next()就是意味著放行去執行下一個函數

注意:向客戶端返回信息的操作(res.send)要放到最后一個處理函數中,如果放到前面則會阻止后面處理函數的運行(這樣的話,后面定義的處理函數有什么意義?),并且當res.sendnext()處于一個處理函數中時會報錯

函數數組

還可以以數組的形式添加回調函數:

const f1 = (req, res, next) => {
    console.log("第一個執行");
    next();
};
const f2 = (req, res, next) => {
    console.log("第二個執行");
    next();
};
const f3 = (req, res) => {
    console.log("最后一個執行");
    res.send("login");
};
app.get("/login", [f1, f2, f3]);

混合使用

混合使用函數和函數數組處理路由:

const fn1 = function (req, res, next) {
    console.log("fn1");
    next();
};

var fn2 = function (req, res, next) {
    console.log("fn2");
    next();
};

app.get(
    "/about",
    [fn1, fn2],
    function (req, res, next) {
        console.log("fn3");
        next();
    },
    function (req, res) {
        res.send("about");
    }
);

應用

可以利用該機制為路由定義前提條件,如果在現有路徑上繼續執行沒有意義,則可將控制權交給剩下的路徑。

例如在開發中經常使用到的token驗證,假如現在共有三個接口:

  • /login 用戶登錄的接口,不需要token驗證

  • /home 只有token驗證通過才能訪問

  • /user 只有token驗證通過才能訪問

這時我們就可以這樣開發:

// 不需要token驗證
app.get("/login", (req, res) => {
    res.send("登錄");
});

// 驗證token的函數(可插拔,可復用的中間件)
const isToken = (req, res, next) => {
    // 驗證token是否過期,isVaild代表token是否有效
    // 一些操作
    const isVaild = true; // 假設驗證通過
    
    if (isVaild) {
        // 驗證通過了就調用next向下執行
        console.log("token驗證通過");
        // 如果想要在回調函數之間傳遞數據,我們可以選擇將數據掛載到res參數上
        res.ailjx = "海底燒烤店ai";
        next();
    } else {
        // 返回錯誤
        // 這里res.send后后面的回調函數就不會再執行了
        res.send("token驗證失敗!");
    }
};

// 只有token有效時才生效的接口
app.get("/home", [isToken], (req, res) => {
    // 返回數據內容
    // res.ailjx:獲取驗證token的函數在res上綁定的數據
    res.send("home" + res.ailjx);
});

app.get("/user", [isToken], (req, res) => {
    // 返回數據內容
    res.send("user");
});

上面我們將驗證token的函數抽離了出去,之后在需要該函數的路由中直接引用即可,這就避免了我們需要在每個路由中都寫一遍token驗證的繁瑣過程。

4、路由級中間件

上面我們定義的路由都是直接綁定到了app對象上,這稱為應用級中間件

應用級中間件綁定到 app 對象 使用 app.use()app.METHOD(), 其中, METHOD 是需要處理的 HTTP 請求的方法,例如 get, put, post 等等,全部小寫。

當我們的路由過多時,這勢必會變得難以維護,于是就出現了路由級中間件用來將我們的路由抽離出來,路由級中間件和應用級中間件一樣,只是它綁定的對象為 express.Router()

// apiRouter.js
const express = require("express");
// router對象
const router = express.Router();

// 路由級別中間件:api路由
router.get("/home", (req, res) => {
    res.send({
        list: [1, 2, 3, 4],
    });
});

router.get("/about", (req, res) => {
    res.send({
        name: "ailjx",
        age: 18,
    });
});

// 導出
module.exports = router;
// server.js
const express = require("express");
const app = express();
// 導入api路由
const apiRouter = require("./route/apiRouter");

// 使用app.use將路由掛載至應用
app.use(apiRouter);

app.listen(3000, () => {
    console.log("start");
});

上面我們使用路由級中間件定義路由,之后通過模塊化導入的形式將路由導入,再使用app.use將路由掛載至應用,這種代碼結構就使得整個項目變得更加容易維護。

在掛載路由時我們也可以指定一級路徑:

// 如果use具有第一個路徑參數,如下面的/api,則/api相當于是一級路徑,apiRouter里的路徑就相當于二級路徑了
app.use("/api", apiRouter);

這樣掛載后的路由訪問時就需要加上/api,如:

  • /api/home

  • /api/about

關于“Node express路由如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广南县| 新乐市| 布拖县| 石嘴山市| 金寨县| 十堰市| 临湘市| 西乌珠穆沁旗| 张家界市| 界首市| 丁青县| 建阳市| 轮台县| 泗水县| 云南省| 银川市| 原平市| 东明县| 永城市| 南澳县| 吴川市| 乐业县| 阳春市| 曲麻莱县| 大埔区| 焉耆| 沛县| 湘西| 迁西县| 德令哈市| 姚安县| 昭平县| 浠水县| 阳信县| 镇江市| 乌审旗| 云阳县| 响水县| 万源市| 顺平县| 汶上县|