成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

學(xué)習(xí)使用ExpressJS 4.0中的新Router

Luosunce / 714人閱讀

摘要:概述中提出了新的路由。創(chuàng)建我們?cè)谥兄付藢傩灾禐?,因此?huì)使用作為應(yīng)用的入口文件。創(chuàng)建路由中間件路由中間件實(shí)際是一種允許一個(gè)請(qǐng)求被處理之前進(jìn)行某些操作的機(jī)制。一個(gè)請(qǐng)求到來(lái)時(shí),它們會(huì)按照代碼中的先后順序依次執(zhí)行。

概述

ExpressJS 4.0中提出了新的路由Router。Router好比是一個(gè)“迷你版”的express應(yīng)用,它沒(méi)有引入views或者settings,但是提供了路由應(yīng)有的API,.use,.get,.paramroute

示例應(yīng)用

讓我們創(chuàng)建一個(gè)express應(yīng)用,僅僅有少量routes和功能:

基礎(chǔ)路由:HomeAbout

一個(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ì)把路由代碼寫(xiě)如server.js文件。將來(lái)為了讓示例應(yīng)用模塊化,我們會(huì)把這些路由代碼分別寫(xiě)入不同的文件,甚至可以為網(wǎng)站的不同組成部分多帶帶定義不同的路由文件。

創(chuàng)建Node應(yīng)用

創(chuàng)建node應(yīng)用,我們需要編寫(xiě)package.json文件去定義node應(yīng)用依賴的插件。

{
    "name": "express-router-experiments",
    "main": "server.js",
    "dependencies": {
        "express": "~4.0.0"
    }
}

下面繼續(xù)安裝依賴:

$ npm install

現(xiàn)在我們安裝了Express,讓我們繼續(xù)編寫(xiě)server.js去處理路由。

創(chuàng)建server

我們?cè)?b>package.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ì)在這里編寫(xiě)自己的路由

// 啟動(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í)打開(kāi)瀏覽器訪問(wèn)http://localhost:8080/sample,我們就能看到這樣下面的文字:this is a sample!。

基本用法 express.Router()

下面我們一起編寫(xiě)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)用中?,F(xiàn)在我們可以通過(guò)http://localhost:8080訪問(wèn)Home頁(yè)面,通過(guò)http://localhost:8080/about訪問(wèn)about頁(yè)面。

請(qǐng)注意:我們可以改變前面定義的路由中默認(rèn)的根路徑("/")。如果我們把app.use("/", router)改為app.use("/app", router),那么home頁(yè)面的訪問(wèn)地址變?yōu)?b>http://localhost:8080/app,about頁(yè)面的訪問(wèn)地址變?yōu)?b>http://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)用到所有訪問(wèn)我們Node應(yīng)用的請(qǐng)求上。打開(kāi)瀏覽器訪問(wèn)http://localhost:8080/app,我們可以看到console打印的信息:im the home page!

在代碼中,中間件和路由的位置順序非常重要。一個(gè)request請(qǐng)求到來(lái)時(shí),它們會(huì)按照代碼中的先后順序依次執(zhí)行。這就意味著如果你把中間件寫(xiě)在某一個(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問(wèn)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)通過(guò)我們把校驗(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問(wèn)到/hello/:name路由,我們編寫(xiě)的參數(shù)中間件就會(huì)介入并做相應(yīng)的校驗(yàn)處理。校驗(yàn)通過(guò)我們把校驗(yàn)后的名字賦值給req對(duì)象,并在相應(yīng)的.get路由中使用req.name獲取校驗(yàn)后的名字。打開(kāi)瀏覽器,訪問(wè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)限訪問(wèn)。

鏈?zhǔn)铰酚?/b>

我們也可以直接在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)铰酚?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99021.html

相關(guān)文章

  • 學(xué)習(xí)express.js源代碼的方法

    摘要:學(xué)習(xí)的源代碼的好處自然不少。閱讀源代碼可以幫你實(shí)現(xiàn)你的好奇心。本文會(huì)推薦一些的源代碼分析文章,可以幫助更快的,更加全方位的理解研讀之。 盡管有Hapi,Koa等有力的競(jìng)爭(zhēng)者,express.js依然是非常流行的nodejs web服務(wù)器框架,畢竟它早于2007年就已經(jīng)在開(kāi)發(fā)了。 學(xué)習(xí)expressjs的源代碼的好處自然不少。 它可以幫你深刻理解HTTP協(xié)議,這個(gè)協(xié)議是做前端后端都必然需...

    huaixiaoz 評(píng)論0 收藏0
  • Node.js

    摘要:本是使用制作一個(gè)簡(jiǎn)單的鏈接項(xiàng)目前準(zhǔn)備安裝安裝安裝項(xiàng)目結(jié)構(gòu)初始化第一步首先新建站點(diǎn),這些我們新建的項(xiàng)目名稱是,如果小伙伴們不知道的這些指令,可以通過(guò)查看插一句,在這之前確保已經(jīng)安裝了第二步進(jìn)入到這個(gè)項(xiàng)目目錄第三步安裝依賴第四步啟動(dòng)這個(gè)項(xiàng)目,這 本demo是使用express+mySql制作一個(gè)簡(jiǎn)單的鏈接sql項(xiàng)目前準(zhǔn)備安裝node.js http://nodejs.cn/安裝expres...

    荊兆峰 評(píng)論0 收藏0
  • 前端每周清單第 48 期:Slack Webpack 構(gòu)建優(yōu)化,CSS 命名規(guī)范與用戶追蹤,Vue.

    摘要:發(fā)布是由團(tuán)隊(duì)開(kāi)源的,操作接口庫(kù),已成為事實(shí)上的瀏覽器操作標(biāo)準(zhǔn)。本周正式發(fā)布,為我們帶來(lái)了,,支持自定義頭部與腳部,支持增強(qiáng),兼容原生協(xié)議等特性變化。新特性介紹日前發(fā)布了大版本更新,引入了一系列的新特性與提升,本文即是對(duì)這些變化進(jìn)行深入解讀。 showImg(https://segmentfault.com/img/remote/1460000012940044); 前端每周清單專注前端...

    sean 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<