學(xué)習(xí)使用ExpressJS 4.0中的新Router的用法
概述
ExpressJS 4.0中提出了新的路由Router。Router好比是一個(gè)“迷你版”的express應(yīng)用,它沒有引入views或者settings,但是提供了路由應(yīng)有的API,.use,.get,.param和route。
示例應(yīng)用
讓我們創(chuàng)建一個(gè)express應(yīng)用,僅僅有少量routes和功能:
- 基礎(chǔ)路由:Home,About
- 一個(gè)把request請(qǐng)求打印到console的路由中間件
- 一個(gè)帶參數(shù)的路由
- 一個(gè)校驗(yàn)特殊參數(shù)的路由中間件
- 一個(gè)用于登錄的路由,響應(yīng)對(duì)與路徑/login的GET和POST請(qǐng)求
- 校驗(yàn)功能:校驗(yàn)傳遞給某一個(gè)路由的參數(shù)
應(yīng)用文件架構(gòu)
我們只需要兩個(gè)文件:
- package.json // 構(gòu)建node應(yīng)用所需要的插件 - server.js // 構(gòu)建示例應(yīng)用的啟動(dòng)文件
我們會(huì)把路由代碼寫如server.js文件。將來(lái)為了讓示例應(yīng)用模塊化,我們會(huì)把這些路由代碼分別寫入不同的文件,甚至可以為網(wǎng)站的不同組成部分單獨(dú)定義不同的路由文件。
創(chuàng)建Node應(yīng)用
創(chuàng)建node應(yīng)用,我們需要編寫package.json文件去定義node應(yīng)用依賴的插件。
{ "name": "express-router-experiments", "main": "server.js", "dependencies": { "express": "~4.0.0" } }
下面繼續(xù)安裝依賴:
$ npm install
現(xiàn)在我們安裝了Express,讓我們繼續(xù)編寫server.js去處理路由。
創(chuàng)建server
我們?cè)趐ackage.json中指定了main屬性值為server.js,因此Express會(huì)使用server.js作為應(yīng)用的入口文件。
// server.js // 基礎(chǔ)設(shè)置 // ============================================== var express = require('express'); var app = express(); var port = process.env.PORT || 8080; // 路由 // ============================================== // 示例路由 app.get('/sample', function(req, res) { res.send('this is a sample!'); }); // 我們會(huì)在這里編寫自己的路由 // 啟動(dòng)server // ============================================== app.listen(port); console.log('Magic happens on port ' + port);
現(xiàn)在我們可以使用命令node server.js啟動(dòng)server。我們使用app.get創(chuàng)建了一個(gè)Express 3時(shí)代的路由,如果此時(shí)打開瀏覽器訪問http://localhost:8080/sample,我們就能看到這樣下面的文字:this is a sample!。
基本用法 express.Router()
下面我們一起編寫Node應(yīng)用前端路由的例子,包括Home頁(yè)面和About頁(yè)面。
// server.js ... // 獲取router實(shí)例 var router = express.Router(); // home頁(yè)面路由(http://localhost:8080) router.get('/', function(req, res) { res.send('im the home page!'); }); // about頁(yè)面路由(http://localhost:8080/about) router.get('/about', function(req, res) { res.send('im the about page!'); }); // 把定義好的路由集成到Node應(yīng)用中 app.use('/', router); ...
我們前面的代碼使用express.Router()生成一個(gè)路由實(shí)例,并定義路由規(guī)則,最后把這個(gè)路由實(shí)例集成到應(yīng)用中。現(xiàn)在我們可以通過http://localhost:8080訪問Home頁(yè)面,通過http://localhost:8080/about訪問about頁(yè)面。
請(qǐng)注意:我們可以改變前面定義的路由中默認(rèn)的根路徑('/')。如果我們把a(bǔ)pp.use('/', router)改為app.use('/app', router),那么home頁(yè)面的訪問地址變?yōu)閔ttp://localhost:8080/app,about頁(yè)面的訪問地址變?yōu)閔ttp://localhost:8080/app/about。
這是一個(gè)非常有用的功能,我們可以利用它創(chuàng)建多個(gè)路由實(shí)例express.Router()并把這些實(shí)例都集成到Node應(yīng)用中。例如,可以在Node應(yīng)用中針對(duì)不同功能需求創(chuàng)建不同的路由:一個(gè)基礎(chǔ)路由,一個(gè)用于權(quán)限校驗(yàn)的路由和其他API路由。如此一來(lái),Node應(yīng)用變得更加模塊化更容易擴(kuò)展。
創(chuàng)建路由中間件Router.use()
路由中間件實(shí)際是一種允許一個(gè)request請(qǐng)求被處理之前進(jìn)行某些操作的機(jī)制。例如,在把一個(gè)request請(qǐng)求的響應(yīng)數(shù)據(jù)返回給用戶之前,我們可以檢查用戶是否有權(quán)限,可以記錄日志等等。
下面我們實(shí)現(xiàn)一個(gè)打印日志的中間件,每次有一個(gè)request請(qǐng)求,我們就在console打印一條信息。
// server.js ... // 獲取router實(shí)例 var router = express.Router(); // 路由中間件:每當(dāng)有一個(gè)request請(qǐng)求都會(huì)執(zhí)行 router.use(function(req, res, next) { // 打印request的method和url console.log(req.method, req.url); // 繼續(xù)處理request請(qǐng)求,尋找匹配的路由 next(); }); // home頁(yè)面路由 (http://localhost:8080) router.get('/', function(req, res) { res.send('im the home page!'); }); // about頁(yè)面路由 (http://localhost:8080/about) router.get('/about', function(req, res) { res.send('im the about page!'); }); // 把定義好的路由集成到Node應(yīng)用中 app.use('/app', router); ...
我們用router.use()用來(lái)定義了路由中間件,并且把它應(yīng)用到所有訪問我們Node應(yīng)用的請(qǐng)求上。打開瀏覽器訪問http://localhost:8080/app,我們可以看到console打印的信息:im the home page!。
在代碼中,中間件和路由的位置順序非常重要。一個(gè)request請(qǐng)求到來(lái)時(shí),它們會(huì)按照代碼中的先后順序依次執(zhí)行。這就意味著如果你把中間件寫在某一個(gè)路由的后面,路由會(huì)攔截這個(gè)request請(qǐng)求并完成響應(yīng),中間件則永遠(yuǎn)不會(huì)被執(zhí)行。
帶參數(shù)的路由 /hello/:name
我們想要在URL中傳遞一個(gè)人的名字name,讓NODE應(yīng)用輸出 Hello name! 這里可以使用帶參數(shù)的路由。
// server.js ... // 獲取router實(shí)例 var router = express.Router(); ... // 帶參數(shù)的路由 (http://localhost:8080/hello/:name) router.get('/hello/:name', function(req, res) { res.send('hello ' + req.params.name + '!'); }); // 把定義好的路由集成到Node應(yīng)用中 app.use('/', router); ...
現(xiàn)在我們?cè)L問http://localhost:8080/hello/holly就可以看到瀏覽器頁(yè)面展示的信息:
Hello holly!
創(chuàng)建參數(shù)中間件
如果想要校驗(yàn)上面?zhèn)魅險(xiǎn)RL的人的名字,確保名字是符合規(guī)范的,我們需要在路由中間件中去校驗(yàn)URL中的參數(shù)name。它有個(gè)特殊的名字,參數(shù)中間件。我們可以使用express.param()去創(chuàng)建它。
// server.js ... // 獲取router實(shí)例 var router = express.Router(); ... // 參數(shù)中間件 校驗(yàn)name參數(shù) router.param('name', function(req, res, next, name) { // 在這里進(jìn)行校驗(yàn)操作 console.log('doing name validations on ' + name); // 校驗(yàn)通過我們把校驗(yàn)后的名字賦值給req對(duì)象 req.name = name; // 繼續(xù)處理request請(qǐng)求,尋找匹配的路由 next(); }); // 帶參數(shù)的路由 (http://localhost:8080/hello/:name) router.get('/hello/:name', function(req, res) { res.send('hello ' + req.name + '!'); }); // 把定義好的路由集成到Node應(yīng)用中 app.use('/', router);
現(xiàn)在當(dāng)我們?cè)L問到/hello/:name路由,我們編寫的參數(shù)中間件就會(huì)介入并做相應(yīng)的校驗(yàn)處理。校驗(yàn)通過我們把校驗(yàn)后的名字賦值給req對(duì)象,并在相應(yīng)的.get路由中使用req.name獲取校驗(yàn)后的名字。打開瀏覽器,訪問http://localhost:8080/hello/sally,我們可以看到瀏覽器展示的信息:
Hello sally!
console控制臺(tái)打印出:
doing name validations on sally
如果你使用RESTful API,你甚至可以校驗(yàn)token是否有效,來(lái)判斷用戶是否有權(quán)限訪問。
鏈?zhǔn)铰酚?/strong>
我們也可以直接在app對(duì)象上創(chuàng)建路由。利用app.route()可以針對(duì)一個(gè)路由定義多個(gè)路由處理函數(shù)。例如,對(duì)/login路由發(fā)起get請(qǐng)求,展示登錄界面,同時(shí)也可以對(duì)/login路由發(fā)起post請(qǐng)求,提交登錄表單信息。我們就可以使用app.route來(lái)創(chuàng)建這個(gè)/login路由。
// ROUTES // ============================================== app.route('/login') // 展示登錄界面 (GET http://localhost:8080/login) .get(function(req, res) { res.send('this is the login form'); }) // 提交登錄表單 (POST http://localhost:8080/login) .post(function(req, res) { console.log('processing'); res.send('processing the login form!'); }); ...
總結(jié)
使用Express 4.0中的路由,我們可以更靈活的定義路由:
- 多次使用express.Router()定義一組路由
- 使用express.Router()劃分模塊,并用app.use()把他們整合起來(lái)
- 使用路由中間件對(duì)request請(qǐng)求進(jìn)行預(yù)處理
- 使用參數(shù)中間.param()件對(duì)URL中參數(shù)進(jìn)行校驗(yàn)
- 使用app.route()創(chuàng)建鏈?zhǔn)铰酚?/li>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
nodejs+websocket實(shí)時(shí)聊天系統(tǒng)改進(jìn)版
這篇文章主要介紹了nodejs+websocket實(shí)時(shí)聊天系統(tǒng)的改進(jìn)版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05nestjs搭建HTTP與WebSocket服務(wù)詳細(xì)過程
這篇文章主要介紹了nestjs搭建HTTP與WebSocket服務(wù)詳細(xì)過程的相關(guān)資料,需要的朋友可以參考下2022-11-11使用NODE.JS創(chuàng)建一個(gè)WEBSERVER(服務(wù)器)的步驟
在 node.js 中創(chuàng)建一個(gè)服務(wù)器非常簡(jiǎn)單,只需要使用 node.js 為我們提供的 http 模塊及相關(guān) API 即可創(chuàng)建一個(gè)麻雀雖小但五臟俱全的web 服務(wù)器,相比 Java/Python/Ruby 搭建web服務(wù)器的過程簡(jiǎn)單的很。本文簡(jiǎn)單的講解下實(shí)現(xiàn)步驟2021-06-06