Express新建工程以及新建路由规则、匹配路由规则、控制权转移
場(chǎng)景
npm提供了大量的第三方模塊,其中不乏許多Web框架,我們沒(méi)有必要重復(fù)發(fā)明輪子,
因而選擇使用Express作為開(kāi)發(fā)框架,因?yàn)樗悄壳白罘€(wěn)定、使用最廣泛,而且Node.js官
方推薦的唯一一個(gè)Web開(kāi)發(fā)框架。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號(hào)
霸道的程序猿
獲取編程相關(guān)電子書(shū)、教程推送與免費(fèi)下載。
實(shí)現(xiàn)
安裝Express
首先需要安裝Express
npm install -g express?
這里使用全局安裝-g,然后還需要安裝express-generator
npm install -g express-generator?
然后可以通過(guò)
express --help來(lái)查看相關(guān)幫助
?
新建Express工程
express -t ejs microblog?
Express在初始化一個(gè)項(xiàng)目的時(shí)候需要指定模板引擎,默認(rèn)支持Jade和ejs,這里使用ejs,同時(shí)暫時(shí)不添加CSS引擎和會(huì)話支持。
后面microblog是項(xiàng)目名,此時(shí)會(huì)生成此目錄以及目錄下文件
并且會(huì)提示我們進(jìn)入其中并執(zhí)行npm install
cd microblog npm install?
安裝依賴成功。
啟動(dòng)服務(wù)器
打開(kāi)項(xiàng)目下的app.js,發(fā)現(xiàn)并沒(méi)有服務(wù)器的端口監(jiān)聽(tīng),加上如下代碼
app.listen(3000,function () {console.log('服務(wù)端啟動(dòng)在3000端口') })然后啟動(dòng)服務(wù)器
node app.js打開(kāi)瀏覽器訪問(wèn)localhost:3000
?
新建路由規(guī)則
新建成的工程是自帶一個(gè)users示例路由
?
所以直接訪問(wèn)
http://localhost:3000/users
?
就能直接訪問(wèn)到routes下的users.js中的響應(yīng)內(nèi)容
?
仿照示例路由首先在app.js,添加路由匹配
app.use('/badao', badaoRouter);badaoRouter在上面聲明
var badaoRouter = require('./routes/badao');然后在routes目錄下新建badao.js
var express = require('express'); var router = express.Router();/* GET users listing. */ router.get('/', function(req, res, next) {res.send('這是來(lái)自badao--公眾號(hào):霸道的程序猿'); });module.exports = router;然后重啟服務(wù)器,訪問(wèn)
http://localhost:3000/badao
?
路由規(guī)則匹配
有時(shí)需要根據(jù)傳遞的參數(shù)進(jìn)行路由的匹配,比如傳遞名字,從而返回Hello+傳遞的名字參數(shù)。
在app.js中引入index根路由的方式是
app.use('/', indexRouter);然后indexRouter是通過(guò)
var indexRouter = require('./routes/index');在routes下index.js中
var express = require('express'); var router = express.Router();/* GET home page. */ router.get('/', function(req, res, next) {res.render('index', { title: 'Express' }); });router.get('/hello',function (req,res) {res.send('cunrrentTime is :'+new Date().toString()) });router.get('/hello/:username',function (req,res) {res.send('Hello:'+req.params.username); });module.exports = router;又新增了兩個(gè)路由這樣,就可以通過(guò)app.js的路由加上此index.js中的路由進(jìn)行匹配。
比如這里的訪問(wèn)hello這個(gè)路由對(duì)應(yīng)的方法
運(yùn)行程序打開(kāi)瀏覽器輸入
http://localhost:3000/hello
?
除此之外還可以獲取路由傳遞的參數(shù)進(jìn)行動(dòng)態(tài)顯示
router.get('/hello/:username',function (req,res) {res.send('Hello:'+req.params.username); });使用:username來(lái)接受路由參數(shù),進(jìn)入響應(yīng)Hello+參數(shù)。
啟動(dòng)程序,然后在瀏覽器中輸入:
http://localhost:3000/hello/霸道的程序猿
?
控制權(quán)轉(zhuǎn)移
Express支持同一路徑綁定多個(gè)路由響應(yīng)函數(shù)。但是當(dāng)你訪問(wèn)這兩條同樣的規(guī)則匹配到的路徑時(shí),會(huì)發(fā)現(xiàn)請(qǐng)求總是
被前一條路由規(guī)則捕獲,后面的規(guī)則會(huì)被忽略。原因是Express在處理路由規(guī)則時(shí),會(huì)優(yōu)先匹配先定義的路由規(guī)則,
因此后面的規(guī)則被屏蔽。
Express提供了路由控制權(quán)轉(zhuǎn)移的方法,即回調(diào)函數(shù)的第三個(gè)參數(shù)next,通過(guò)調(diào)用next()將路由控制權(quán)交給后面的規(guī)則。
這讓我們可以實(shí)現(xiàn)中間件,而且還能提高代碼的復(fù)用程度。
例如針對(duì)用戶查詢信息和修改信息的操作,其中一個(gè)步驟是檢查用戶名是否存在,因此可以通過(guò)next()方法實(shí)現(xiàn)。
繼續(xù)使用上面的獲取路由參數(shù)的方式,在上面新增的路由badao.js中聲明一個(gè)對(duì)象和設(shè)置屬性值
var users = {'badao':{name:'badao',blog:'https://blog.csdn.net/BADAO_LIUMANG_QIZHI'} }然后新增兩個(gè)同路徑匹配的路由
router.all('/:username',function (req,res,next) {if(users[req.params.username]){next();}else{next(new Error(req.params.username+'不存在'))} }); router.get('/:username',function (req,res) {res.send(JSON.stringify(users[req.params.username])); });上面兩個(gè)路由首先走第一個(gè)驗(yàn)證傳遞的username參數(shù)是否存在,不存在則返回錯(cuò)誤,提示則調(diào)用next進(jìn)而將對(duì)象信息返回。
badao.js完整代碼
var express = require('express'); var router = express.Router(); var users = {'badao':{name:'badao',blog:'https://blog.csdn.net/BADAO_LIUMANG_QIZHI'} } /* GET users listing. */ router.get('/', function(req, res, next) {res.send('這是來(lái)自badao--公眾號(hào):霸道的程序猿'); });router.all('/:username',function (req,res,next) {if(users[req.params.username]){next();}else{next(new Error(req.params.username+'不存在'))} }); router.get('/:username',function (req,res) {res.send(JSON.stringify(users[req.params.username])); });module.exports = router;然后重新運(yùn)行項(xiàng)目,打卡瀏覽器輸入
http://localhost:3000/badao/bada
?
然后輸入正確的名字參數(shù)
http://localhost:3000/badao/badao
?
示例代碼下載
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12969105
總結(jié)
以上是生活随笔為你收集整理的Express新建工程以及新建路由规则、匹配路由规则、控制权转移的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JS中怎样获取当前年以及前后几年并构造成
- 下一篇: Express中使用ejs新建项目以及e