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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Node.js学习笔记(三)——Node.js开发Web后台服务
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。使用Node.js作为AngularJS开发Web服务器的最佳方式是使用Express模块。
张果
2022/09/28
8.2K0
Node.js学习笔记(三)——Node.js开发Web后台服务
node中Express的use深入理解
Express的API 现在学node,不来点Express,都不好意思给人打招呼。但是,我刚接触的时候,觉得好多API,感觉乱糟糟的,没办法,大脑容量不够。不过有一样东西叫地铁,在上面可以让人想清楚很多事情(-_-! 先来一段最简单的node版hello world var http = require('http');http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'})
前朝楚水
2018/04/03
1.2K0
带你零基础入门express
作为一篇新手入门,这篇文章没有太多的技巧和花式,只是从零开始带你学习和掌握express的开发应用,比较适合于完全没有使用过express的新手,以及其他非前端同学。
练小习
2018/04/07
5K18
带你零基础入门express
Express4.x API (四):Router (译)
Express4.x API 译文 系列文章 已经完成了Express4.x API中的Requst和Response对象的文档翻译。简单的总结,request对象即表示HTTP请求,包含了请求查询字
okaychen
2018/01/05
2.1K0
express基本原理
先回顾一下 express 使用的的过程,首先是把模块倒入,然后当做方法执行,在返回值中调用 use 处理路由,调用 listen 监听端口。
Qiang
2019/06/23
8350
express基本原理
Node.js学习笔记——Express、路由、中间件、接口跨域解决方案详解(附实例)
Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架 通俗的理解:Express 的作用和 Node.js 内置的 http 模块类似,是专门用来创建 Web 服务器的。 本质就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法 中文官网 http://www.expressjs.com.cn/
timerring
2022/07/20
3.8K0
Node.js学习笔记——Express、路由、中间件、接口跨域解决方案详解(附实例)
node框架express的研究0.前言1. 从入口开始1.1入口1.2 proto1.2.1 app.init方法1.2.2 app.handle方法1.2.3 每一个method的处理1.2.4
在node中,express可以说是node中的jQuery了,简单粗暴,容易上手,用过即会,那么我们来试一下怎么实现。下面我们基于4.16.2版本进行研究
lhyt
2018/10/31
1.1K0
express4.0源码解析
express4.X 跟3.X 有很大区别,4.X 去除了connect的依赖,3.X基于connect的中间件基本全部不能用,如果还有可以使用的,也是4.X重写的。所以要想继续使用这些熟悉的中间件,就要手动安装依赖包,或者用一些其他的中间件。
frontoldman
2019/09/02
7500
Express中间件,看这篇文章就够了(#^.^#)
okaychen
2018/01/05
2.1K0
Express中间件,看这篇文章就够了(#^.^#)
node Express 框架
Express事实上Node内置的http模块上构建的一层抽象。理论上所有Express实现的功能都能用Node实现
mySoul
2018/07/29
5.3K0
Express 中间件
去年刚入职不久参与公司Mean技术栈的培训,其中有share过Express的东西,由于当时没有参与过实际项目,对Express理解并不深刻。后来有幸参与ShuttleBus项目,在实际使用中对Express有了些许了解,这里就把自己的想法写出来。
李振
2021/11/26
1.4K0
Express框架的学习介绍
原生的http在某些方面表现不足以应对我们的开发需求,所以就需要使用框架来加快我们的开发效率,框架的目的就是提高效率,让我们的代码高度统一。
泽霖
2023/11/29
2740
Express中间件的介绍
接下来我们使用Node.js创建一个HTTP服务器,并自定义三个中间件:cookie、query和post-body。
zayyo
2023/11/30
3200
Nodejs之express框架的基本使用
此文是个人学习归纳的记录,腾讯云首发,未经允许,严禁转载,如有不对, 还望斧正, 感谢!
言志志
2024/04/30
2020
NodeJS背后的人:Express
前置知识:需要掌握了解: JavaScript基础语法 、Node.JS环境API 、前端工程\模块化 ·····
Java_慈祥
2024/08/06
2570
NodeJS背后的人:Express
express中app.use和app.get的区别及解析
写在前面:最近研究nodejs及其web框架express,对app.use和app.get没理解清,以致踩了坑浪费不少时间,我根据自己实践及总结出此博客,若有错误还请大家多多指教。 结论 先说我发现的结论: app.use(path,callback)中的callback既可以是router对象又可以是函数 app.get(path,callback)中的callback只能是函数 结论说完,让我们先看个栗子 例子 app.js var express = require('express');var a
前朝楚水
2018/04/03
1.4K0
Express4.x API (二):Request (译)
最近学习express想要系统的过一遍API,www.expressjs.com是express英文官网(进入www.epxressjs.com.cn发现也是只有前几句话是中文呀~~),所以自己准备在
okaychen
2018/01/05
2.3K0
Express(一) ——简单入门
背景:参加的青训营项目,使用 Express 来实现后端,个人被分配到后端去。于是,简单速通了下 Express。项目结束,回头写下笔记,沉淀一下。
赤蓝紫
2023/01/02
3.6K0
Express(一) ——简单入门
08_Express框架
使用Node.js进行服务器开发,开发效率比较低,例如在实现路由功能和静态源访问功能时,代码写起来很烦琐 为了提高Node.js服务器的开发效率,人们开发了Express框架,它可以帮助开发人员快速创建网站应用程序。
张哥编程
2024/12/13
1630
08_Express框架
Express version 4.17核心源码解析
Express的源码、以及目前现在主流库已经全部使用TypeScript编写,呼吁大家全面切换到TypeScript
Peter谭金杰
2020/05/09
5670
Express version 4.17核心源码解析
相关推荐
Node.js学习笔记(三)——Node.js开发Web后台服务
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验