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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AI简史 | 星际英雄传说
阿纳海姆会议中心的暴雪嘉年华上,尚未正式发布的RTS游戏大作《星际争霸II》举行了试玩活动。
量子位
2018/07/24
5290
AI简史 | 星际英雄传说
RTS人工智能研究的历史
在过去十年中,研究人员已经从单独研究RTS游戏的不同人工智能技术,转变为更加复杂的游戏中的合作与竞争,不同的技术进行了对比。为了使这项工作取得成功,以下条件是必要的: • 为研究人员开发和评估机器人开放的API • 比赛使研究人员能够比较不同的技术 • 重放学习算法用于培训 • 人类对手评估机器人的表现 这些条件大部分是在2009年发布了母巢战API的,但是这个平台的封闭性让研究人员对AI系统的训练过程实现自动化具有挑战性。随着星际争霸2开放环境的公布,研究人员将有很大机会在RTS游戏中开发具有专家级性能的
刀刀老高
2018/04/10
1.3K0
RTS人工智能研究的历史
DeepMind星际争霸2 AI首秀即将上演,旭东老仙奶一口?
在 AlphaGo征服围棋之后,《星际争霸》一直被人工智能研究者视为下一个目标,因为它相比国际象棋与围棋更接近「复杂的现实世界」,DeepMind 科学家 Oriol Vinyals 曾表示:「能玩《星际争霸》的人工智能必须能够有效利用记忆,能够进行长期战略规划,同时还得根据不断出现的新情况做出反应调整。以这种标准开发的机器学习系统,最终完全可以应用到现实世界中的任务中去」。
机器之心
2019/04/29
5190
DeepMind星际争霸2 AI首秀即将上演,旭东老仙奶一口?
DeepMind联手暴雪:星际II的玩家们,准备好对抗AI了吗(附论文)
大数据文摘作品,转载要求见文末 作者:宁云州、魏子敏、Aileen 星际II的玩家们,你们准备好迎接被AI支配的恐惧了吗?! 用阿尔法狗征服了围棋界的DeepMind正把目光投向游戏界:今日凌晨,DeepMind官网发布消息,已正式与暴雪娱乐合作,共同开发可以在星际争霸II中与人类玩家对抗的AI,并且发布了SC2LE,一个旨在加速即时战略游戏当中AI应用的工具集。 早在去年,Deepmind已经立下Flag要教会AI玩儿星际争霸II,也已经有包括facebook、阿里巴巴等不少科技公司或者研究机构开拓过“星
大数据文摘
2018/05/25
5280
星际 AI 争霸 6 年简史:通用人工智能角斗场,DeepMind确认应战
【新智元导读】《星际争霸》被认为是继围棋、扑克之后,AI 与人较量的下一个竞技场。同时也是训练和研究通用人工智能的一个适合的虚拟场景,目前,DeepMind、微软、Facebook和阿里巴巴都在研究用AI 来玩这一游戏,希望能增强AI 智能体的通用能力,让AI 更像人。其实,用AI 来玩《星际争霸》早在2010年就有人开始研究,主要集中在国外的大学和研究所中,本文介绍了从2010年到2015年这一领域取得的进展和竞赛情况:每一年都有新的技术更新和变迁。 游戏,更准确地说,模拟场景对于人工智能的研发来是一个非
新智元
2018/03/27
1.9K0
星际 AI 争霸 6 年简史:通用人工智能角斗场,DeepMind确认应战
Deepmind AI在《星际争霸2》血虐99.8%人类,登顶宗师段位
对于大多数游戏玩家来说,游戏内置的电脑AI,似乎都是一个笑话,更应该被称为“人工智障”。
新智元
2020/04/21
6170
Deepmind AI在《星际争霸2》血虐99.8%人类,登顶宗师段位
【中国战队包揽234却无缘冠军】OpenAI 的 Dota2 机器人强在哪?
【新智元导读】DOTA2 经典赛事TI7国际邀请赛决出最后冠军,中国团队虽占据234名但无缘冠军。回顾本届比赛,Open AI 的机器人因为战胜了人类玩家而大放异彩,团队也在Twitter上宣布欢迎更多玩家挑战和试用自己的技术。本文带来深度解读,战胜了人类玩家的Open AI 机器人究竟强在哪里?与围棋比赛中的AlphaGo相比是强还是弱?未来在虚拟游戏中,人类是否对机器毫无胜算? Dota2 TI7决赛,中国战队惜败无缘冠军,包揽2、3、4名 8月13日,DOTA2 经典赛事TI7国际邀请赛在美国西雅图钥
新智元
2018/03/22
1.2K0
【中国战队包揽234却无缘冠军】OpenAI 的 Dota2 机器人强在哪?
AlphaStar被职业玩家戏耍:在星际2上,人工智能无计可施
为了提高人工智能水平,DeepMind 与暴雪在战网天梯中开放了 AlphaStar:玩家只要进行申请并通过就可以和这个最强 AI 进行在线对决了。而且现在,AlphaStar 已经可以使用全部三个种族。
机器之心
2019/09/10
7430
AlphaStar被职业玩家戏耍:在星际2上,人工智能无计可施
教 AI 打牌打游戏,不止是为了战胜人类
场景描述:昨日,DeepMind 宣布其研发的 AI——AlphaStar 将会登录欧服,匿名在天梯上与人类玩家进行《星际争霸 2》比拼。今天,Facebook 与 CMU 合作开发的 AI 赌神 Pluribus ,在六人局的德州扑克比赛中击败人类顶级玩家的消息又刷屏。AI 在游戏比赛中的表现越来越突出,但我们不断训练 AI 在游戏中去战胜人类,最终的目的与意义是什么?
kbsc13
2019/08/16
8920
终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
刚刚,DeepMind和暴雪联合宣布,北京时间周五凌晨2点,公开展示AI打《星际争霸II》(下称星际2)的新进展!
量子位
2019/04/24
4410
终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始
AI又要和人类“对打”了!今天凌晨,Deepmind在推特上官宣,将和暴雪联合,于北京时间周五凌晨两点,在Twitch上直播AI打《星际争霸II》。
镁客网
2019/05/07
6030
AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始
多图详解 DeepMind 的超人类水准星际争霸 AI 「AlphaStar」
参加直播的 DeepMind 研究人员是 DeepMind 团队联合研发负责人 Oriol Vinyals 和 David Silver,后者也是 AlphaGo 项目的核心开发人员,我们都比较熟悉了。
AI科技评论
2019/11/01
3.9K0
多图详解 DeepMind 的超人类水准星际争霸 AI 「AlphaStar」
学界 | 中科院开源星际争霸2宏观运营研究数据集MSC
选自arXiv 机器之心编译 参与:李泽南、蒋思源 DeepMind 与暴雪共同发起的星际争霸 2 人工智能研究看起来遭遇了很大挑战。目前的人工智能还难以在完整对战中击败简单级别的游戏内建电脑玩家。不过,两家公司 8 月份共同推出的人工智能研究环境 SC2LE 为后续研究提供了可利用的平台。中国科学院自动化研究所的研究人员最近针对宏观运营任务提出了全新数据集 MSC,试图推动研究社区继续前进。值得一提的是,中科院自动化所的团队 10 月 8 日刚刚在星际争霸 AI 竞赛 AIIDE 2017 上取得第四名
机器之心
2018/05/08
8120
学界 | 中科院开源星际争霸2宏观运营研究数据集MSC
AI打《星际》被人类碾压?不,事情并没有这么简单
李林 千平 发自 凹非寺 量子位 出品 | 公众号 QbitAI “人类总算能摆脱被统治的阴影”。 这两天,一场《星际争霸》的人机对抗“表演赛”,让不少人类感到扬眉吐气。毕竟在这场比赛中,韩国顶级职业
量子位
2018/03/23
1K0
星际争霸界也出了位“带路党”,当年的冠军正帮谷歌AI击败人类
李杉 若朴 发自 凹非寺 量子位 出品 | 公众号 QbitAI 1990年代,十几岁的Oriol Vinyals(维纽斯)成了西班牙《星际争霸》全国冠军。 他之所以玩这款科幻策略游戏,是因为比其他打打杀杀的游戏更需要动脑子。维纽斯说:“没上大学之前,这款游戏就让我在生活中怀有更强的战略思维。” 他的战略思维的确获得了回报:在巴塞罗那学习了电信工程和数学之后,维纽斯去过微软研究院实习,获得了加州大学伯克利的计算机博士学位,接着加入谷歌大脑团队,开始从事人工智能开发工作,然后又转入谷歌旗
量子位
2018/03/23
7260
【重磅】DeepMind进军星际争霸2,谷歌Facebook打响通用AI战争
【新智元导读】7日,Facebook刚刚宣布开源史上最大的《星际争霸》游戏数据集STARDATA。今天(10日)DeepMind在官方博客上宣布开源星际争霸2 研究训练平台SC2LE。AI 巨头挑战星际争霸的角逐愈演愈烈。乌镇围棋峰会上,DeepMind CEO 哈萨比斯曾说,星际争霸将成为AI进步的下一个大考验。 国内AI 资深专家袁泉此前曾深入研究过星际争霸中的若干AI问题,和UCL共同发表了多智能体协作网络BiCNet,第一次展现了AI在星际微观战斗中的五类智能协作方式。新智元对此做过专门报道。此次D
新智元
2018/03/22
1.1K0
【重磅】DeepMind进军星际争霸2,谷歌Facebook打响通用AI战争
【DOTA之后新里程碑】DeepMind强化学习重大突破:AI在多人射击游戏完胜人类!
【新智元导读】继OpenAI之后,DeepMind也在多智能体强化学习方面秀肌肉:首次在第一人称射击游戏的多人模式中完胜人类,而且没有使用大量训练局数,轻松超过了人类水平。
新智元
2018/07/31
6280
【DOTA之后新里程碑】DeepMind强化学习重大突破:AI在多人射击游戏完胜人类!
动态 | DeepMind和暴雪联手发布开发工具和replay数据集,让更多AI研究者玩上星际2
AI 科技评论按:去年年底的时候,大家都知道了 DeepMind 的人工智能要开始玩星际了,今天DeepMind 也正式发布了论文和相关博文介绍了自己在这方面的成果,他们与暴雪联手发布了一系列工具,方便更多的研究者参与到(让人工智能)玩星际2中来。AI 科技评论编译如下。 DeepMind 一直抱有这样的一个科学目标:构建能学会解决复杂问题的系统,以此来不断推进人工智能的发展前沿。为此,DeepMind 开发了各种各样的智能体,然后在自己搭建的 DeepMind Lab 平台上用各种各样的环境测试它们。 有
AI科技评论
2018/03/13
7590
动态 | DeepMind和暴雪联手发布开发工具和replay数据集,让更多AI研究者玩上星际2
1-10落败,5分钟崩盘!星际2职业高手史上首次被AI击溃,AlphaStar一战成名
DeepMind开发的全新AI程序AlphaStar,在今天凌晨的《星际争霸2》人机大战直播节目中,轻松战胜2018 WCS Circuit排名13、神族最强10人之一的MaNa。
量子位
2019/04/24
4960
1-10落败,5分钟崩盘!星际2职业高手史上首次被AI击溃,AlphaStar一战成名
学界 | 学习顶级玩家Replay,人工智能学会了星际争霸的「大局观」
选自arXiv 机器之心编译 参与:李泽南 学会了哥的运营,剩下的就是 A 了——「F91」孙一峰。 神经网络是机器学习的一个重要分支,近年来随着深度学习的兴起展现了强大的能力。近日,来自 IT University of Copenhagen 的几位学者尝试使用顶级玩家的 Replay 训练一个深度学习模型来打星际争霸,并获得了成功。经过训练的 AI 学会了人类玩家运营的部分技巧,并在对战中展现出了多种不同策略。 有关星际争霸系列游戏的人工智能研究层出不穷,因为这一即时战略游戏(RTS)的环境复杂,在同类
机器之心
2018/05/09
7950
学界 | 学习顶级玩家Replay,人工智能学会了星际争霸的「大局观」
推荐阅读
AI简史 | 星际英雄传说
5290
RTS人工智能研究的历史
1.3K0
DeepMind星际争霸2 AI首秀即将上演,旭东老仙奶一口?
5190
DeepMind联手暴雪:星际II的玩家们,准备好对抗AI了吗(附论文)
5280
星际 AI 争霸 6 年简史:通用人工智能角斗场,DeepMind确认应战
1.9K0
Deepmind AI在《星际争霸2》血虐99.8%人类,登顶宗师段位
6170
【中国战队包揽234却无缘冠军】OpenAI 的 Dota2 机器人强在哪?
1.2K0
AlphaStar被职业玩家戏耍:在星际2上,人工智能无计可施
7430
教 AI 打牌打游戏,不止是为了战胜人类
8920
终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
4410
AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始
6030
多图详解 DeepMind 的超人类水准星际争霸 AI 「AlphaStar」
3.9K0
学界 | 中科院开源星际争霸2宏观运营研究数据集MSC
8120
AI打《星际》被人类碾压?不,事情并没有这么简单
1K0
星际争霸界也出了位“带路党”,当年的冠军正帮谷歌AI击败人类
7260
【重磅】DeepMind进军星际争霸2,谷歌Facebook打响通用AI战争
1.1K0
【DOTA之后新里程碑】DeepMind强化学习重大突破:AI在多人射击游戏完胜人类!
6280
动态 | DeepMind和暴雪联手发布开发工具和replay数据集,让更多AI研究者玩上星际2
7590
1-10落败,5分钟崩盘!星际2职业高手史上首次被AI击溃,AlphaStar一战成名
4960
学界 | 学习顶级玩家Replay,人工智能学会了星际争霸的「大局观」
7950
相关推荐
AI简史 | 星际英雄传说
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验