Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Express.js 4.0 有加入一個新的 Router 功能

Express.js 4.0 有加入一個新的 Router 功能

作者头像
前朝楚水
发布于 2018-04-03 08:58:23
发布于 2018-04-03 08:58:23
1.1K00
代码可运行
举报
文章被收录于专栏:互联网杂技互联网杂技
运行总次数:0
代码可运行

Express.js 4.0 有加入一個新的 Router 功能,它就像一個迷你的應用程式,可以讓應用程式內部的路由撰寫更方便、更有彈性。

Express.js 在 4.0 版中有許多新的功能,其中一項主要的功能就是 Router,以下我們介紹如何使用 Router 功能來撰寫應用程式。

基本應用程式

首先建立一個 package.json 檔案,定義套件的相依資訊:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "name": "express-router-experiments",    "main": "server.js",    "dependencies": {
        "express": "~4.0.0"
    }}

建立好package.json 之後,就可以使用 npm 指令自動安裝所需要的套件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install

接著建立主要的 server.js,其內容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ---- 基本設定 ----var express = require('express');var app     = express();var port    = process.env.PORT || 8080;// ---- ROUTES ----// 舊方法app.get('/sample', function(req, res) {
  res.send('this is a sample!');});// ---- 啟動伺服器 ----app.listen(port);

接著就可以測試一下伺服器是否可以正常運作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node server.js

正常來說,這時候開啟瀏覽器輸入 http://localhost:8080/sample/ 這個網址,就可以看到 this is a sample! 這樣的訊息。

這個範例中,我們使用 app.get 來處理路由的問題,這種方式是 Express 3.0 的用法,接下來我們會使用 Express 4.0 的 Router 功能來加入更多的路由。

Express Router

我們在既有的路由之後,使用新的 Router 功能加上額外的一些路由設定:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ---- 基本設定 ----var express = require('express');var app     = express();var port    = process.env.PORT || 8080;// ---- ROUTES ----// 舊方法app.get('/sample', function(req, res) {
  res.send('this is a sample!');});// Express Router// 建立 Router 物件var router = express.Router();// 首頁路由 (http://localhost:8080)router.get('/', function(req, res) {
  res.send('home page!');});// 另一張網頁路由 (http://localhost:8080/about)router.get('/about', function(req, res) {
  res.send('about page!');});// 將路由套用至應用程式app.use('/', router);// ---- 啟動伺服器 ----app.listen(port);

這裡我們建立一個 Router 物件,然後設定這個物件的路由規則,最後再將這個 Router 物件的路由規則套用至應用程式中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.use('/', router);

這樣一來,我們就建立了 http://localhost:8080http://localhost:8080/about 這兩張網頁。

將路由套用至應用程式時,可以指定路由的基礎路徑,舉例來說,如果我們將路徑指定為 /app

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.use('/app', router);

這樣建立的兩個路由就會變成 http://localhost:8080/apphttp://localhost:8080/app/about

這樣的特性可以讓我們很方便地將不同功能的路由區分開來,分別建立不同的 Router 物件,以不同的路徑套用至應用程式中,讓程式結構模組化且更有彈性。

Route Middleware

Express 的 middleware 功能可以讓請求(request)在被處理之前,先執行一些前置作業,例如檢查使用者是否有登入或是紀錄一些使用者的瀏覽資料等等,凡是需要在實際處理請求之前要做的動作,都可以使用 middleware 來處理。

下面這個範例是一個簡單的 middleware,它會在每一個請求被處理之前,輸出一行紀錄訊息到終端機上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ... (略)// 建立 Router 物件var router = express.Router();// 在每一個請求被處理之前都會執行的 middlewarerouter.use(function(req, res, next) {

  // 輸出記錄訊息至終端機
  console.log(req.method, req.url);  // 繼續路由處理
  next();});// 首頁路由 (http://localhost:8080)router.get('/', function(req, res) {
  res.send('home page!');});// 另一張網頁路由 (http://localhost:8080/about)router.get('/about', function(req, res) {
  res.send('about page!');});// 將路由套用至應用程式app.use('/', router);// ... (略)

這樣一來,只要有任何請求要處理時,終端機上就會輸出對應的紀錄訊息。

在使用 middleware 時必須要注意他的放置位置必須要在 routes 之前,程式在執行的時候會依據 middleware 與 routes 的先後順序來執行,如果不小心將 middleware 放在 routes 之後,那麼在 routes 處理完請求之後就會結束處理的流程,這樣 middleware 就根本不會執行。

參數路由(Route with Parameters)

路由的規則除了使用固定的字串之外,也可以包含會變動參數,下面這個例子可以將使用者的名稱透過 URL 傳入程式中,並且根據使用者的名稱輸出訊息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ... (略)// 含有參數的路由 (http://localhost:8080/hello/:name)router.get('/hello/:name', function(req, res) {
  res.send('hello ' + req.params.name + '!');});// 將路由套用至應用程式app.use('/', router);// ... (略)

這裡的 :name 就像一個變數名稱,如果我們輸入的 URL 為 http://localhost:8080/hello/seal,那麼在程式中的 req.params.name 所抓取到的值就會是 'seal',透過這樣的機制我們就可以跟不同的使用者打招呼。

驗證參數

有時候我們會需要針對傳入的路由參數來進行篩選或驗證,例如檢查使用者所輸入的字串是否是合法的名稱,這時候就可以使用 .param() 這個專門用來處理參數的 middleware:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ... (略)// 驗證 :name 的 route middlewarerouter.param('name', function(req, res, next, name) {

  // 在這裡驗證資料
  // ... ... ...

  // 顯示驗證訊息
  console.log('doing name validations on ' + name);  // 當驗證成功時,將其儲存至 req
  req.name = name;  // 繼續後續的處理流程
  next();});// 含有參數的路由 (http://localhost:8080/hello/:name)router.get('/hello/:name', function(req, res) {
  res.send('hello ' + req.name + '!');});// 將路由套用至應用程式app.use('/', router);// ... (略)

這樣在每次有 :name 參數傳入時,就會先執行這裡新增的 middleware,經過驗證確定沒問題之後,再將傳入的名稱儲存至 req 中,透過這樣的方式將驗證過的資料傳遞給 .get 路由,所以在 .get 路由中,我們也將原本的 req.params.name 改為 req.name

現在當我們開啟 http://localhost:8080/hello/seal 的時候,終端機中就會出現驗證的訊息:

登入路由

除了使用 express.Router() 的方式來建立路由之外,我們也可以使用 app.route 直接在應用程式上新增路由,這種方式是 Router 的簡略寫法,語法看起來就跟傳統上的 app.get 很類似。

使用 app.route 有個好處是可以讓我們一次針對一個路由新增好幾個動作,例如我們想要使用 GET 顯示登入表單,並且使用 POST 處理表單:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ... (略)// ---- 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!');  });// ... (略)

這樣一來程式就可以在 /login 這個路由上將 GETPOST 分開處理,而且這樣的寫法既方便又簡潔。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 交互设计前端开发与后端程序设计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Rust日报】2019-09-06:文字RPG
作者之前寫過 MUDdy 像MUD的純文字互動遊戲,但只是單機的 Read more
MikeLoveRust
2019/09/09
7150
【Rust日报】2019-09-06:文字RPG
麦克风阵列声源定位实现[通俗易懂]
TDOA (Time Difference of Arrival) 是指同一音源的訊號傳遞到兩支麥克風的時間差由麥克風所取樣的訊號來估算。而時域上常見的計算方法有四種:AMDF(Average Magnitude Difference Function)、ratio AMDF、最小平方法、Cross Correlation。我们採用最常見且穩定性高的Cross Correlation。
全栈程序员站长
2022/09/30
1.7K0
麦克风阵列声源定位实现[通俗易懂]
在Jetson上玩转大模型Day7:執行RAG功能的Jetson Copilot
爲了要協助處理這種現象,目前最流行的方法就是使用俗稱“檢索增強生成”的RAG(Retrieval-Augmented Generation)技術,爲手上的大語言模型助手提供補強或微調的功能。
GPUS Lady
2024/10/31
1960
在Jetson上玩转大模型Day7:執行RAG功能的Jetson Copilot
分析 WordPress 3.8.2 修復的cookie偽造漏洞
4月8日,wordpress發布了一個重要更新,在該次更新中,修復了一系列安全漏洞。其中最顯眼的就是cookie伪造漏洞(CVE -2014- 0166)。 我們來看修補的代碼: $key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme); $hash = hash_hmac('md5', $username . '|' . $expiration, $key); - if ( $hmac != $hash ) { + if (
FB客服
2018/02/02
8450
分析 WordPress 3.8.2 修復的cookie偽造漏洞
解密特斯拉自動駕駛晶片背後的一號人物
源自:虎嗅網 作者:國仁 在自動駕駛領域,AI晶片其實並非新奇玩意。Mobileye的EyeQ系列晶片,就是較早應用於自動駕駛的AI晶片之一。 而在這個月早些時候,矽谷鋼鐵俠馬斯克,還宣佈了特斯拉正在研發用於自動駕駛的AI晶片,回顧馬斯克對自動駕駛晶片的各種動作,我們發現近來各種跳票“不靠譜”的他,其實對技術發展的趨勢,遠比看上去更理解。 馬斯克對特斯拉自行研發自動駕駛晶片的佈局,從兩年前就開始了。 一、從Mobileye到英偉達 特斯拉的自動駕駛焦慮症 2014年,特斯拉找上Mobileye,用上了它
企鹅号小编
2018/01/25
9680
計算機程序設計:7大編程原則
編程的工作同石匠的工作相類似,即是技術活,也是體力活,而編寫優秀的軟件,算是一件比較難的事。編程大牛們並不是直接上手編寫,而是根據需求進行設計,不但將代碼中 Bug 出現的機率降到最低,還要讓代碼具有高可讀性,高安全性等等。
一个会写诗的程序员
2020/09/01
6100
在Jetson上玩转大模型Day7:執行RAG功能的Jetson Copilot
在前面的大語言模型測試過程,一定會發現這些智能助手都存在一些“胡言亂語”、“答非所問”之類的狀況,其實可以將它視爲“不瞭解邊界”的小孩童一樣,因爲所有人工智能模型,都是再它的知識庫中,尋找“機率最高”的答案,很有可能這個答案的正確率還不到5%,但它不能回答“不知道”,必須找到一組以上的回覆(response),即便其正確率並不高。
GPUS Lady
2024/10/29
1510
在Jetson上玩转大模型Day7:執行RAG功能的Jetson Copilot
在Jetson上玩转大模型Day6:Ollama的Webui智能助手
前面已經教會大家很輕鬆地使用 Ollama 搭建一個在指令終端的交互式智能助手,但這種操作模式畢竟比較粗糙,而且只能在一臺機器上使用,實用性並不高,如果能搭建一個Web界面的智能助手,並且可以讓局域網裏的其他人一起使用的話,就能大大提高這個項目的實用價值。
GPUS Lady
2024/10/28
2350
在Jetson上玩转大模型Day6:Ollama的Webui智能助手
主动学习与被动学习
美國學者艾德格‧戴爾(Edgar Dale)提出了「學習金字塔」(Cone of Learning)的理論:在初次學習兩個星期後,透過閱讀學習能夠記住內容的10%;透過聽講學習能夠記住內容的20%;透過圖片學習能夠記住內容的30%;透過影像、展覽、示範、現場觀摩來學習能夠記住50%;參與討論、提問、發言來學習能夠記住70%;做報告、教學、模擬體驗、實際操作能夠記住90%。美國緬因州國家訓練實驗室(National Training Laboratories)做過類似的研究,結論跟戴爾差不多。由此可知,閱讀是最沒用的學習方式,而模擬、體驗與實作才是最好的學習方式。是嗎?
超蛋lhy
2018/08/31
1.7K0
主动学习与被动学习
【Rust日报】 2020-01-10 track_caller 錯誤處理大突破
use anyhow + thiserror in place of failure
MikeLoveRust
2020/02/12
5660
linux 信号sigabrt,關於Linux中的SIGABRT信號
SIGABRT是中止一個程序,它可以被捕捉,但不能被阻塞。處理函數返回后,所有打開的文件描述符將會被關閉,流也會被flush。程序會結束,有可能的話還會core dump。 當程序調用abort(3)時,該進程會向自己發送SIGABRT信號。所以,SIGABRT一般用於信號中一些關鍵的處理,assert失敗時也會使用它。你不應該去捕捉SIGSEGV和SIGABRT信號,如果收到這種信號,說明進程處於一個不確定的狀態,很可能會直接掛起。
全栈程序员站长
2022/07/23
2.9K0
區塊鏈在網絡安全中的應用
通過數字化日常生活的各個方面逃離現實世界危險的人們開始意識到,與離線相比,互聯網不再是一個安全的地方。在2018年,我們看到了網絡犯罪分子造成的許多災難性故障,看起來在即將到來的一年中,我們將會有更多的故障。 幸運的是,黑客並不是唯一一個正在開發其電力庫的人 - 多年來,網絡安全中的區塊鏈一直在增長,並在所有可能的行業中得到開發。儘管該技術僅用於存儲加密貨幣比特幣,但其影響和影響現在已經擴散到更多不同的領域。在本文中,我們將討論Blockchain在2019年的含義,為您提供安全性中Blockchain的一些用例。
用户4624829
2019/02/15
3590
Using Automake and Autoconf「建议收藏」
Murray Cumming <murrayc@usa.net> Chen Chih-Chia <pigfoot@CDPA.nsysu.edu.tw>
全栈程序员站长
2022/07/25
4460
正確使用 SetCapture ReleaseCapture [譯]「建议收藏」
原文鏈接: http://www.codeproject.com/Tips/127813/Using-SetCapture…correctly.aspx 原作者: pasztorpisti 轉載請註明出處:http://www.imoldman.com/2010/11/30/ using-setcaptu…ture-correctly
全栈程序员站长
2022/09/01
5220
ios苹果app上架流程
什麼都是假的,只有 App 上架 Store 才是真的。千辛萬苦完成 App 後,下一步、也是最重要的一步,就是把 App 送審上架!為了讓新手都能一次就送審成
iOS程序应用
2023/02/10
1.4K0
ios苹果app上架流程
【ES三周年】基于ELK的日志分析服务
本專題作品開發一套基於ELK的日誌分析服務,提供多種日誌類型解析及對應的可視化功能。目前提供的日誌類型分別為系統日誌(syslog)、網功能變數名稱稱系統日誌(dnslog)及網頁伺服器日誌(nginxlog),可視化功能包含圖表呈現和文字說明等。
sh1mwww
2023/02/15
1.3K0
第一性原理 《禅与计算机程序设计艺术》 / 陈光剑
第一性原理(First Principle Thinking),指的是回歸事物最基本的條件,將其拆分成各要素進行解構分析,從而找到實現目標最優路徑的方法。
一个会写诗的程序员
2021/04/20
1.2K0
第一性原理 《禅与计算机程序设计艺术》 / 陈光剑
RESTful
HTTP 状态码(HTTP Status Code)是用以表示网页服务器 HTTP 响应状态的 3 位数字代码。所有状态码的第一个数字代表了响应的五种状态之一。 除非另有说明,状态码是 HTTP / 1.1 标准(RFC 7231)的一部分。
Cell
2022/02/25
8540
C#-笔记-面向对象-第一章
我們把這些具有相同屬性和相同的方法的對象進一步的封裝,抽象出來類這個概念,類就是模子,確定了對象應該具有的屬性和方法。 對象是根據類創建出來的。
用户9857551
2022/06/28
3260
C#-笔记-面向对象-第一章
在Jetson上玩转大模型Day8:多模態搜圖的NanoDB
AI 這個項目是一个CUDA优化的多模态向量数据库,使用CLIP vision Transformer 中的嵌入模型进行txt2img和img2img相似性搜索,實現下面的“以文找圖”與“以圖找圖”的功能,這對現代人來說是一項福音,因爲大部分人總是困擾着,得在一堆圖片中找到所需要的目標,但是文件名能表達的意義有太有限。
GPUS Lady
2024/10/30
1480
在Jetson上玩转大模型Day8:多模態搜圖的NanoDB
相关推荐
【Rust日报】2019-09-06:文字RPG
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验