Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Express 路由

Express 路由

作者头像
李振
发布于 2021-11-26 07:16:53
发布于 2021-11-26 07:16:53
1.6K00
代码可运行
举报
文章被收录于专栏:乱码李乱码李
运行总次数:0
代码可运行

Routing

前面说到Express有两个核心概念:Middleware和Routing。什么是Routing呢,简单来说就是http请求与服务端应答逻辑之间的映射关系。

路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback…], callback), app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数。

上篇由if else处理不同的get请求就是最原始的路由,但是如果项目稍微大一点,维护无数else将是开发者的噩梦。幸好Express有强大的路由机制,比如解析url,正则表达式匹配等等,给开发者带来小小便利。

路由方法

路由方法是http请求时Express对应的方法,主要有app.get()、app.put()、app.post()、app.delete()等。 比如,匹配起GET /和负责回应主页的方法homepageHandler,可以这么写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.get('/', function homepageHandler(request, response) { ... });

而要匹配POST /reivew/new和负责添加新评论的方法addNewReview(假设它已经在别处定义好了)则可以是:

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

app.all()是一个特殊的方法,它的作用是对于一个路径上的所有请求加载中间件,在下面的例子中,来自 “/secret” 的请求,不管使用 GET、POST、PUT、DELETE 或其他任何 http 模块支持的 HTTP 请求,句柄都会得到执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app.all('/secret', function (req, res, next) {
  console.log('Accessing the secret section ...');
  next(); // pass control to the next handler
});

如果处理某个HTTP方法+path对的逻辑很复杂的话,我们也可以把它拆分成middleware栈的形式,依次传给app.METHOD()方法,也就是app.METHOD(path, [middleware…], last_middleware)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var http = require('http');
var express = require('express');
var logger = require('morgan');

var app = express();

app.use(logger('short'));
app.get('/', function (req, res) {
    res.end('Welcome to Homepage');
});

app.get('/about', function (req, res) {
    res.end('Welcome to About page');
});

app.use(function (req, res, next) {
    var err = new Error('404: Page Not Found');
    err.status = 404;
    next(err);
});

app.use(function errorHandler(err, req, res, next) {
    res.status(err.status || 500);
    res.end(err.message);
});

var server = http.createServer(app);

server.listen(3000);

以上就是定义routing的第一种方式。

Router对象

Express的Router对象,也就是之前提到的router-level middleware,可以从两个方面来理解:

可以等同于整个应用中的一个子应用,比如一个RESTful API;它有自己的middleware栈 抽象地来看,可以简单视为整个应用middleware栈中的一片

在开发Express应用的时候,我们可以想想,整个应用是不是可以分拆为许多子应用,例如像上面所提到的,可以有个子应用专门来负责和数据库沟通并返回JSON格式的信息,即一个RESTful API。那么,在代码里,我们就可以新建一个子应用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var apiRouter = express.Router();

然后,像主应用一样,我们可以为这个子应用添加middleware和routing:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiRouter.get('/id', ...);
apiRouter.post('/review/new', ...);
apiRouter.put(...);
apiRouter.delete(...);

最后,把所有path以/api开头的HTTP请求都导入到这个子应用去:

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

上面的用法跟middleware的设定是一模一样的,只不过这里添加的不是一个方法,而是一个Router对象。这也是Router对象称为router-level middleware的原因。

响应方法

下表中响应对象(res)的方法向客户端返回响应,终结请求响应的循环。如果在路由句柄中一个方法也不调用,来自客户端的请求会一直挂起。

方法

描述

res.download()

提示下载文件。

res.end()

终结响应处理流程。

res.json()

发送一个 JSON 格式的响应。

res.jsonp()

发送一个支持 JSONP 的 JSON 格式的响应。

res.redirect()

重定向请求。

res.render()

渲染视图模板。

res.send()

发送各种类型的响应。

res.sendFile

以八位字节流的形式发送文件。

res.sendStatus()

设置响应状态代码,并将其以字符串形式作为响应体的一部分发送。

参数化的path

假如有两篇文章的请求地址分别为 a/article 和 b/article, 服务器对这两篇文章的Get请求处理逻辑是相同的,Express如何做routing呢?换言之,Express如何把HTTP方法+一类path和相关的逻辑对应起来呢?

最简单的方法就是将这一类path中不同的那一部分看作一个参数,给它取个名字,并在其前加上一个引号。

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

这样就把所有的形如GET+/xxxxxxx/article的请求和这段负责回复博客的逻辑handleArticleRequest对应了起来。其中:name表示path的这一部分是一个参数,Express会自动把这部分的值存在对应的req.params.name这个对象里,以便这段逻辑使用。假如handleArticleRequest是一个方法,那么它大概会是这么个结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function handleArticleRequest(req, res) {
    var name = req.params.name;
    // ...
}

类似的,当path含有query部分的时候,Express也会自动把query的部分存到req.query这个对象里面。假如说一个path含有query为?p1=v1&p2=v2,那么在处理它的逻辑里,我们可以通过req.query.p1和req.query.p2来访问相应的值(都会是string对象)。

结语

以上就是对Express的routing机制的一点简单的介绍。更详细的内容参见 官网

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
安全运营项目的工作方法
我们做了大量的安全运营工作,这些事情以项目论起来有大有小,不同公司对这些从事这些一线运营工作的内容描述有“拿结果”、“push”、"落地"、“打法”、"主导"不同的说法,我比较认可“推动”的说法,通过运营专项推动工作达到预定的治理效果,”推“和”动“很形象地说明关于安全运营的主要工作:需要主动“推一推才动”,安全的特点确实是要做成一件事,合作方确实有很少的意愿去配合,所以需要有科学的办法去运营这些事情。
安全乐观主义
2021/12/06
1.3K0
安全运营项目的工作方法
项目总延期?质量不可控?程序员如何做好项目管理
本文由腾讯MoonWebTeam团队成员赖文辉、蔡卓伦、刘冬、陈长吉协作完成 👉导读 程序员对工作量评估不准确?日常临时问题打乱排期?怎么让大家对需求的理解一致?如何既保证开发效率又保证质量?项目管理是「把事情做对」的重要能力之一。知识型工作者包括程序员,在工作中都不知不觉中扮演着「非职业项目经理」的角色。具备项目管理能力,对程序员职业发展、个人生活都有重大价值。本文详细分析程序员如何进行进度管理、质量管理和风险管理。 👉看目录 1 为什么开发需要懂项目管理     1.1 项目管理是“通过别人做成事情”的
欧文
2023/04/04
7490
项目总延期?质量不可控?程序员如何做好项目管理
技术人核心竞争力:被忽视的项目管理能力
程序员对工作量评估不准确?日常临时问题打乱排期?怎么让大家对需求的理解一致?如何既保证开发效率又保证质量?项目管理是「把事情做对」的重要能力之一。知识型工作者包括程序员,在工作中都不知不觉中扮演着「非职业项目经理」的角色。具备项目管理能力,对程序员职业发展、个人生活都有重大价值。本文详细分析程序员如何进行进度管理、质量管理和风险管理。
腾讯云开发者
2025/03/20
2250
技术人核心竞争力:被忽视的项目管理能力
项目总延期?需求乱插队?程序员如何做好项目管理
👉腾小云导读 程序员对工作量评估不准确?日常临时问题打乱排期?怎么让大家对需求的理解一致?如何既保证开发效率又保证质量?项目管理是「把事情做对」的重要能力之一。知识型工作者包括程序员,在工作中都不知不觉中扮演着「非职业项目经理」的角色。具备项目管理能力,对程序员职业发展、个人生活都有重大价值。本文详细分析程序员如何进行进度管理、质量管理和风险管理。 👉看目录 1 为什么开发者需要懂项目管理     1.1 项目管理是“通过别人做成事情”的能力     1.2 项目管理能输出个人影响力     1.3 项目管
腾讯云开发者
2023/03/21
1.3K0
项目总延期?需求乱插队?程序员如何做好项目管理
年前最后一周的正确打开姿势,写一份项目总结吧
2019-12-16 关于作者 宜娜,腾讯CSIG部门员工 导语I之前有段时间研究了下达利欧的《原则》这本书,里面提到了一点:要做一个透明人,对自己对他人都做到无限透明,那么团队协作的效率会高很多。所以,我打算将自己最近几个月做的项目--SOC图谱分析也复盘整理下,尽可能透明地呈现给大家,希望团队的小伙伴们都能够看到,在以后的协作过程中少踩坑,高效协作。同时,也是想让自己对过去的工作有个全局视角,更好地指导未来的工作,避免在下一阶段犯同样的错误、踩类似的坑。当然,也欢迎大家多多批评指正,帮助我们更快地成长
腾讯大讲堂
2020/02/12
8350
年前最后一周的正确打开姿势,写一份项目总结吧
QA如何跟进跨部门项目
转转作为电商平台,有很多跨部门项目,那么作为QA在跨部门项目中如何发挥出自己更大的价值是一个值得思考的问题。通常来讲,一个项目分为测试前、测试中、测试后三个大的节点,QA要深度参与其中,把控整个项目全局,才能交付高质量的项目。
雷子
2021/03/15
6560
QA如何跟进跨部门项目
产品经理在说的"项目管理"到底是什么?
众所周知,产品经理跟项目经理的岗位职责是有区别的,但在部分公司,产品经理在进行规划产品的同时,偶尔也要担负部分项目经理的工作,阿境结合市面上项目管理的流程及自己所处公司的情况,讲讲产品经理如何进行项目管理。
物流IT圈
2020/07/07
1.1K0
产品经理在说的"项目管理"到底是什么?
远程办公工作效率低?是你没找对方法
Boss 远程办公期间,团队管理太难了!都不知道工作进度如何了。 在家认真努力,按时完成工作任务,怎样让领导看得见。 托马斯 TAPD 远程办公进度不透明,工作效率低,看不到产出,是不是你们没找对方法。前段时间,我们采访了几位远程办公资深实践者,一起来看看他们是如何通过TAPD进行远程协作,助力企业增效降本的吧~ 一、目标的制定、拆解和量化 在远程办公期间,最担心的就是团队成员没有共识,职权不清晰,目标管理是凝聚团队共识,增强大局意识的良好方法。目标管理是以人为中心,以成果为标准,
TAPD敏捷研发
2020/04/07
7500
工作系统 V0.2
自我与复杂事物相抗衡时稳定发挥,靠的不是奋斗、状态和运气,而是包含认知和方法论的系统。
星辉
2020/06/23
3900
你需要知道的项目管理知识
👆 这是第 111 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:你需要知道的项目管理知识 https://www.zoo.team/article/project-manage-ablout 前言 作为一名软件开发工程师,为什么要了解项目管理知识呢?不知你是否在想,程序员只要写好代码就好了,何必要关心项目管理呢。在当今程序员行业愈发饱和的时候,保持竞争力是永恒的话题,而项目管理知识作为程序员的“软技能”之一,不仅能锻炼你的组织协调、沟通协
政采云前端团队
2021/09/08
7250
2022金九银十 —— 招聘有感,给各位测试同学的一些建议
前段时间因公司的业务扩展需要,测试部人员编制开始扩招。 这里简单介绍一下团队的基本编制与架构: 团队编制1+3+12(经理+组长+执行),执行包括业务、测开等角色。 博主在测试行业摸鱼了十余年,面试过的人也算不少,本次总共招聘了4名测试同学,面试的过程让我这个中年人也是十分的有感触,借着本次【金九银十面试经验创作活动】的机会希望能通过此文给广大的测试同学一些小小的启发。
Austin_zhai
2022/09/21
4210
项目管理的3个关键动作:启动、推进、复盘
在实际工作中,作为管理者,除了要掌握超强的业务能力,还需要能够具备“推项目、拉团队”的能力。这里我们来探讨如何系统性进行团队的项目管理。
物流IT圈
2020/07/02
1.1K0
设计结构化实践手册(三) 如何有效组织设计输出与表达
本手册分为三章,你能获得什么: 1. 设计师为什么需要结构化思维:有脑就懂的结构化思维和实践原理。 2. 如何系统化地进行学习:化整为零的设计学习和知识输入技巧。 3. 如何有效组织设计输出:有手就会的设计输出技巧与表达实战能力。<<<we are here 前面的结构化输入与分析更多地是能帮我们自己提升思考能力和学习能力,但设计师做了东西总要给人看和用,结构化输出能更好地帮助沟通对象去吸收我们希望对方理解的内容。接下来的章节会带大家了解一些朴实无华的输出小技巧。 首先设计输出基于短期和长期大概可以划分为四
腾讯ISUX
2023/05/22
7730
设计结构化实践手册(三) 如何有效组织设计输出与表达
在日活10亿的产品做TPM实习生是怎样的体验?
这段实习经历,可能是不太幸运的2022年里最幸福的一件事。第一次接触到从前耳闻向往却不曾亲眼目睹的职业,这段体验极大程度地超出了我的预期,“成就他人”是贯穿我们行动的关键词。在这里,作为实习生,我也能得到充分的空间进行思考和行动。
KKCHANNEL
2023/03/08
7440
在日活10亿的产品做TPM实习生是怎样的体验?
关于技术人员晋级答辩实用小Tips
笔者一共参加过3次公司内的晋级答辩,均为一次通过。从评委反馈评价来看,也是一个逐渐向好的过程。除此之外,笔者还曾经担任过部门的晋级答辩小助手,全程参与过一次小组晋级答辩的组织工作。
ruoyuliu
2023/08/26
1.6K1
关于技术人员晋级答辩实用小Tips
如何在快节奏工作环境下实现个人技术沉淀
在快节奏的工作环境中,许多开发者因被项目进度推着走,很难抽出时间进行系统的技术学习与沉淀。本文将分享一些有效的时间管理技巧,以及如何在忙碌的工作中,依然保持技术成长的节奏。通过合理的规划与方法论,开发者可以在保证工作质量的同时,不断积累技术深度。
Swift社区
2024/10/09
2140
如何在快节奏工作环境下实现个人技术沉淀
如何让项目准时上线?
项目延期是一种普遍现象,管理者最为头疼的一个问题。但是外人并不理解。明明是你们自己做的计划,怎么总会出现这么多问题。说到底,这是由于我们的工作特性决定的。我们做的是一个创造性的工作,他不像建房子,有特定的步骤。我们实现一个功能,怎么写,有多少行代码,我们在写之前是不知道的。
石云升
2022/08/25
4760
如何让项目准时上线?
一个完整的项目复盘到底要怎么做?
从计划到执行到复盘,只有复盘整个活动流程,才算做活动项目完整结束,那么,如何真正做好“复盘”这项工作呢?
物流IT圈
2019/11/18
5.7K0
提升项目管理能力,你需要掌握这5个重点
而在2009年,任正非也曾提出,“一家好的企业,必然要以项目为中心;优秀的企业员工,必然要具备项目管理能力。”
飞项
2021/08/03
4.3K0
提升项目管理能力,你需要掌握这5个重点
项目管理之问,ChatGPT作答
I. 项目管理概述 A. 项目管理定义和目标 B. 项目管理的重要性和价值 C. 项目管理生命周期
明志德道
2023/11/26
3180
推荐阅读
相关推荐
安全运营项目的工作方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验