express文档地址

什么是中间件呢(middleware)?它是谁的中间件呢?

首先我们需要了解到请求和响应,

请求就是客户端发送请求给服务器,

响应就是,服务器根据客户端的请求返回给客户端的数据,

那么中间件,就是当客户端请求服务端时,会向服务器传输一些数据,那么中间件就是处理这些客户端发送往服务器端的数据的,如果一个服务有好多个中间件,那么当客户端向服务器发送请求时,会先经历所有的中间件依次执行完后,再将请求发送给服务器。这就是中间件的作用;

-------------------------------------------------------------------------------------------------------------

我们先来简单的建一个express中间件,写一个简单的自定义中间件

server.js

var express = require("express");//引入express

var app = express();//创建express实例

app.use(function(req,res,next){//app.use()就是注册中间件的,我们传入的这个函数就是中间件,req代表请求,res,代表响应,next:调用next后会执行下一个中间件,不调用下下一个中间件就不会执行,从而,请求就不会传递到服务器
console.log("first middleware");
next();
}) app.use(function(req,res,next){//注册第二个中间件 第二个中间件 等到第一个中间件执行完后 调用next()之后才会执行 同理 一次类推
console.log("secoded middleware");
next();
}) app.get("/",function(req,res,next){//next参数可以不传 因为这一步响应就结束了 不用执行next
res.send("ok")
}) app.listen(3000);
console.log("listening to port 3000")

当然,我们可以提前结束响应,比如我们想在第二个中间件中结束响应,我们可以这样做

var express = require("express");//引入express

var app = express();//创建express实例

app.use(function(req,res,next){//app.use()就是注册中间件的,我们传入的这个函数就是中间件,req代表请求,res,代表响应,next:调用next后会执行下一个中间件,不调用下下一个中间件就不会执行,从而,请求就不会传递到服务器
console.log("first middleware");
next();
}) app.use(function(req,res,next){//注册第二个中间件 第二个中间件 等到第一个中间件执行完后 调用next()之后才会执行 同理 一次类推
console.log("secoded middleware");
res.send("响应结束");
// next();
}) app.get("/",function(req,res,next){//next参数可以不传 因为这一步响应就结束了 不用执行next
res.send("ok")
}) app.listen(3000);
console.log("listening to port 3000")

上面将第二个中间件中的next()注释掉,请求到第二个中间件就会停止,然后,我们调用了res.send()方法,告诉客户,请求结束

下面来看一下middleware的执行顺序,我们另外又增加了一个middleware,在这三个middleware的next()后面都打印出一句话,我们来看看中间件的执行顺序是怎样的

var express = require("express");//引入express

var app = express();//创建express实例

app.use(function(req,res,next){
console.log("first middleware");
next();
console.log("first middleware after");
}) app.use(function(req,res,next){
console.log("secoded middleware");
next();
console.log("secnded middleware after");
}) app.use(function(req,res,next){
console.log("third middleware");
next();
console.log("third middleware after");
}) app.get("/",function(req,res,next){//next参数可以不传 因为这一步响应就结束了 不用执行next
res.send("ok")
}) app.listen(3000);
console.log("listening to port 3000")

我们来看一下,这六个console打印执行的顺序:

first middleware
secoded middleware
third middleware
third middleware after
secnded middleware after
first middleware after

可以看出,当下一个中间件完全执行完之后,才会去执行上一个中间件的next()后面的语句!!!!

-------------------------------------------

中间件还可以加一个路径参数,指定是哪个路由下的中间件,如:

app.use("/home",function(req,res,next){//减伤这个路径参数后,只有访问这个home路由时才会执行此中间件!!!
console.log("third middleware");
next();
console.log("third middleware after");
})

------------------------------------------------------------------------------------------------

下面来看一个内置的中间件,响应静态文件的中间件!!!

server.js

var express = require("express");//引入express

var app = express();//创建express实例

app.use(express.static('public'));//express.static是静态文件中间件,里面指定一个文件夹路径(其实就是静态文件的根目录),我们在客户端访问localhost:3000/touxiang.png就可以访问到public目录中的文件

app.listen(3000);
console.log("listening to port 3000")

我们还需要在根路径上建立一个public文件夹,里面放一张图片,加入图片名称叫touxiang.png

那么我们在浏览器上访问localhost:3000/touxiang.png

我们就可以在浏览器看到 这张图片了

如果我们在public文件夹下再建立个文件夹assets文件夹,里面放一个index.html页面,我们就可以在浏览器这样访问这个html页面:localhost:3000/assets/index.html

如果我们要给静态文件中间件指定一个路由呢?那这些静态文件应该如何访问呢?

先给静态文件加一个路由,加入是assets

app.use("/assets",express.static('public'));

应该这样访问到刚才的俩静态文件

http://localhost:3000/assets/touxiang.png
http://localhost:3000/assets/assets/index.html

只需要在刚才的访问路径前加上这个assets路由即可

我们可以这样理解,express.static('路径')指定的是,当前路由下,静态文件的根目录!!!这样理解就很不错了

-----------------------------------------------------------------------------------------------------------------

下面来看一下路由中间件

我们之前写的路由接口,都是写在server.js中的,有非常多的app.get(...)和app.post(...),这样都把路由写在一个文件中,就会显的非常臃肿,因为一般的应用都会有好多接口的,那么路由中间件就可以解决这样的问题

加入我们的服务器入口文件里(server.js)有两个路由

var express = require("express");//引入express

var app = express();//创建express实例

app.get("/users",function(req,res,next){
res.send("users");
}) app.get("/",function(req,res,next){
res.send("root");
}) app.listen(3000);
console.log("listening to port 3000")

一个根路由,一个users路由,我们想将这两类路由放到其它地方

首先我们在跟目录建立一个routers文件夹,里面分别新建index.js和users.js

index.js内容:

var express = require("express");//引入express
var router = express.Router();//注意Router首字母大写
router.get("/",function(req,res,next){
res.send("root");
}) module.exports = router;//导出router

users.js内容

var express = require("express");//引入express
var router = express.Router();//注意Router首字母大写
router.get("/",function(req,res,next){//注意 users.js中定义的路由 的路由要改成跟路由"/"
res.send("users");
}) module.exports = router;//导出router

server.js

var express = require("express");//引入express

var app = express();//创建express实例

var indexRouter = require('./routers/index');//引入跟路由
var usersRouter = require('./routers/users');//引入users路由 app.use("/",indexRouter);//使用中间件
app.use("/users",usersRouter);//使用中间件 app.listen(3000);
console.log("listening to port 3000")

然后我们就可以在浏览器访问localhost:3000和localhost:3000/users    我们就可以得到相对应响应内容了!!

express中的中间件(middleware)、自定义中间件、静态文件中间件、路由中间件的更多相关文章

  1. Express (Routing、Middleware、托管静态文件、view engine 等等)

    1. Express 简介 Express 是基于 Node.js 平台,快速.开放.极简的 web 开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用. Express 不对 ...

  2. ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...

  3. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

  4. NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    NET Core 1.1 静态文件.路由.自定义中间件.身份验证简介   概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要 ...

  5. Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)

    原始文章链接:http://www.lovebxm.com/2017/07/14/express-primer/ 1. Express 简介 Express 是基于 Node.js 平台,快速.开放. ...

  6. django 组件 自定义过滤器 自定义标签 静态文件配置

    组件 将一些功能标签写在一个html文件里,这个文件作为一个组件,如果那个文件需要就直接拿过来使用即可: 这是title.html文件,写了一个导航栏,作为一个公用的组件 <div style= ...

  7. django模板中导入js、css等静态文件

    打开settings.py,在底部添加: import os STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(os.path.dir ...

  8. Django-配置、静态文件与路由

    -----配置文件 1.BASE_DIR BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))   2.DEBU ...

  9. django复习-2-配置、静态文件与路由

    一.配置文件 1. BASE_DIR BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) __file__指当 ...

  10. Django(静态文件or路由)

    静态文件 在开发中同创会使用到 css,js,img等静态文件,这里带大家简单的介绍一下django如何处理静态页面, 配置 setting.py文件 STATIC_URL = '/static/' ...

随机推荐

  1. FPS 游戏实现D3D透视

    FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视 ...

  2. hdu 2586 欧拉序+rmq 求lca

    题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...

  3. 数据结构之队列(queue)

    队列介绍 1.队列是一个有序列表,可以用数组或是链表来实现. 2.遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出. 应用场景 比如某某银行叫号系统: 数组模拟队列 队列本身是有序 ...

  4. 将网址url中的参数转化为JSON格式的两种方法

    在我们进入主题前,我先先看下获取网址URL的方法: window.location.href // 设置或获取整个URL为字符串 window.location.hash // 设置或获取href属性 ...

  5. iOS音频学习笔记三:音频会话管理

    ​      使用Audio Session API ,可以指定App需要的音频行为,比如,当播放音频时,使得其他应用App静音或者混和在一起,也可以指定当App的音频被中断(例如被电话)时的行为,还 ...

  6. IO模型之AIO代码及其实践详解

    一.AIO简介 AIO是java中IO模型的一种,作为NIO的改进和增强随JDK1.7版本更新被集成在JDK的nio包中,因此AIO也被称作是NIO2.0.区别于传统的BIO(Blocking IO, ...

  7. [LeetCode] 95. 不同的二叉搜索树 II ☆☆☆(递归,n个数组成的所有二叉搜索树)

    https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/xiang-xi-tong-su-de-si-lu-fe ...

  8. 软件自带依赖库还是共享对象库/为什么linux发行版之间不能有一个统一的二进制软件包标准

    接前文:Linux软件包(源码包和二进制包)及其区别和特点 在前文,我们知道了linux软件包分为源码包和二进制包两种方式,而不同的发行版之间又有着自己的二进制打包格式. 首先,软件运行依赖着各种各样 ...

  9. Android笔记(三十) Android中线程之间的通信(二)Handler消息传递机制

    什么是Handler 之前说过了,Android不允许主线程(MainThread)外的线程(WorkerThread)去修改UI组件,但是又不能把所有的更新UI的操作都放在主线程中去(会造成ANR) ...

  10. 初始化springbean

    public class SMSMessageHandler implements InitializingBean { @Overridepublic void afterPropertiesSet ...