首頁 web前端 js教程 詳解NodeJS框架express的路徑映射(路由)功能及控制的範例程式碼

詳解NodeJS框架express的路徑映射(路由)功能及控制的範例程式碼

Mar 25, 2017 pm 02:55 PM

這篇文章主要介紹了詳解NodeJS框架express的路徑映射(路由)功能及控制,具有一定的參考價值,有興趣的小夥伴們可以參考一下。的非常優秀的服務端開發框架,本篇CSSer將提供express框架的route和route control章節,route實現了客戶端請求的URL的路徑映射功能,暫且譯為路由或URL映射吧。理解,相信看完這篇文章將會有些收穫的。 URL對映

API

,例如我們可能想要讓使用者帳號的URL看起來像「/user/12」的樣子,下面的範例就能實現這樣的路由,其中​​與佔位識別碼(本例為:id)相關的值可以被req.params取得到。了一個監聽get請求事件的偵聽器,當請求的URL滿足第一個參數時,執行後面的

回呼函數

,該程序是異步的。被內部編譯成正規表示式的簡單

字串

#,例如當/user/:id被編譯後,被內部編譯後的正規表示式字串看起來會是下面的樣子(簡化後):程式碼如下:

app.get('/user/:id', function(req, res){

  res.send('user ' + req.params.id);

});
登入後複製

要實現複雜點的,我們可以傳入正規表示式直接量,因為正則捕獲組是匿名的因此我們可以通過req.params進行訪問,第一個捕獲組應該是req.params[0],第二個應該是req.params[1],以此類推。 #的curl指令來測試我們定義的路由:

下面是一些路由例子,以及與之相符的關聯路徑:

app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){

  res.send(req.params);

});
登入後複製

另外,我們可以透過POST方式提交json數據,然後利用bodyParser中間件解析json請求體並把json資料回傳給客戶端:

通常我們所使用的佔位符(例如/user/:id)都沒有任何限制,即使用者可以傳入各種資料型別的id值,如果我們希望限制使用者id為數字,可以這樣寫“/user/:id(\d+)”,這樣就能保證只有該佔位符資料型別為

數值型別

才會進行路由的相關處理。

路由控制

一個應用程式中可以定義多個路由,我們可以控制以令其轉向下一個路由,Express提供了第三個參數即next( )函數。當一個模式不被匹配時,控制將被轉回 Connect(Express基於Connect模組),同時中間件會繼續按照它們在use()中增加的順序來執行。當多個定義的路由都可能匹配同一個 URL時也是如此,除非某個路由並未呼叫next()且已將回應輸出到客戶端,否則它們也將依序執行。

"/user/:id"

/user/12

 

"/users/:id?"

/users/5

/users

 

"/files/*"

/files/jquery.js

/files/javascripts/jquery.js

 

"/file/*.*"

/files/jquery.js

/files/javascripts/jquery.js

 

"/user/:id/:operation?"

/user/1

/user/1/edit

 

"/products.:format"

/products.json

/products.xml

 

"/products.:format?"

/products.json

/products.xml

/products

 

"/user/:id.:format?"

/user/12

/user/12.json
登入後複製

app.all()方法可以對所有HTTP動作應用單一呼叫入口,這在某些情況下很有用。下面我們使用該功能來從我們的模擬資料庫載入一個用戶,並把它分配給req.user。

var express = require('express')

 , app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(req, res){

 res.send(req.body);

});

app.listen(3000);
登入後複製

路由參數預處理路由參數預處理透過隱含的資料處理,可以大幅提升應用程式碼的可讀性和請求URL的驗證。假如你經常性的從幾個路由獲取通用數據,如通過/user/:id加載用戶信息,通常我們可能會這樣做:

app.get('/users/:id?', function(req, res, next){

  var id = req.params.id;

  if (id) {

    // 一回注:如果在这里就将响应内容输出给客户端,那么后续的URL映射将不会被调用

  } else {

    next(); // 将控制转向下一个符合URL的路由

  }

});

 

app.get('/users', function(req, res){

  // do something else

});
登入後複製

利用預處理後參數可以被映射到回調函數,從而可以提供諸如驗證、強制改變值,甚至從資料庫載入資料等功能。下面我們將呼叫app.param()並傳入 我們希望對應到某個中間件的參數,可以看到我們接收了包含佔位符(:userId)值的id參數。這裡可以像平常一樣進行使用者資料載入以及錯誤處理,並 能簡單的透過呼叫next()將控制權轉向下一個預處理或路由(路徑控制)。

var express = require('express')

 , app = express.createServer(); 

var users = [{ name: 'www.csser.com' }];

app.all('/user/:id/:op?', function(req, res, next){

 req.user = users[req.params.id];

 if (req.user) {

  next();

 } else {

  next(new Error('cannot find user ' + req.params.id));

 }

});

app.get('/user/:id', function(req, res){

 res.send('viewing ' + req.user.name);

});

app.get('/user/:id/edit', function(req, res){

 res.send('editing ' + req.user.name);

}); 

app.put('/user/:id', function(req, res){

 res.send('updating ' + req.user.name);

});

app.get('*', function(req, res){

 res.send('what???', 404);

});
app.listen(3000);
登入後複製

這樣做,不僅向上面提到的可以大幅提高路由的可讀性,還能在整個應用中共享該部分的邏輯實現,達到復用目的。

app.get('/user/:userId', function(req, res, next){

 User.get(req.params.userId, function(err, user){

  if (err) return next(err);

  res.send('user ' + user.name);

 });

});
登入後複製

對於簡單的情況如路由佔位符驗證和強迫改變值,只需要傳入1個參數(支援1個參數),期間拋出的異常將自動傳入next(err)。

app.param('number', function(n){ return parseInt(n, 10); });
登入後複製

也可以同时将回调函数应用到多个占位符,比如路由/commits/:from-:to来说,:from和:to都是数值类型,我们可以将它们定义为数组

app.param(['from', 'to'], function(n){ return parseInt(n, 10); });
登入後複製

结语

通 过本文的学习,我们应该有些感觉了,NodeJS不仅仅可以实现我们产品的服务端逻辑,同时我们还可以利用Javascript做服务器编程,注意是服务 器,也就是说,我们可以利用Javascript来定制以往只能在apache中才可以做到的功能。NodeJS还需要rewrite吗?路径映射更简单 更强大,还要rewrite干嘛用?

以上是詳解NodeJS框架express的路徑映射(路由)功能及控制的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

nodejs可以寫前端嗎 nodejs可以寫前端嗎 Apr 21, 2024 am 05:00 AM

是的,Node.js可用於前端開發,主要優勢包括高效能、豐富的生態系統和跨平台相容性。需要考慮的注意事項有學習曲線、工具支援和社群規模較小。

See all articles