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. 利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4

    利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4 以前看视频的时候,直接找到 video标签,查看视频地址,然后下载下来.. 后来发现,好多 video 标签打开元素审查,如下 ...

  2. hdu 6661 Acesrc and String Theory (后缀数组)

    大意: 求重复$k$次的子串个数 枚举重复长度$i$, 把整个串分为$n/i$块, 如果每块可以$O(1)$计算, 那么最终复杂度就为$O(nlogn)$ 有个结论是: 以$j$开头的子串重复次数最大 ...

  3. windows Git Bash 无法运行python文件的解决方法(转)

    https://blog.csdn.net/xie_0723/article/details/51958243

  4. Python之(scrapy)爬虫

    一.Scrapy是Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸 ...

  5. 【转载】C#使用Split函数根据特定分隔符分割字符串

    在C#程序开发过程中,很多时候可能需要将字符串根据特定的分割字符分割成字符或者List集合,例如根据逗号将字符串分割为数组,或者根据竖线将字符串分割成数组,C#中提供了Split()函数来快速将字符串 ...

  6. 学习到目前,自己封装的db类和pdo类

    DB封装类 <?php class DBDA { public $host = "localhost"; public $uid = "root"; pu ...

  7. Cron 定时任务表达式

    Cron Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth M ...

  8. py-2 python介绍与安装

    一.python介绍 1.python背景 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Py ...

  9. Linux命令——ps、pstree

    转载请注明出处:https://www.cnblogs.com/kelamoyujuzhen/p/9814883.html ps 简介 ps(processes status)是Unix / Linu ...

  10. Windows server 2012 利用ntdsutil工具实现AD角色转移及删除域控方法

    场景1:主域控制器与辅助域控制器运行正常,相互间可以实现AD复制功能.需要把辅助域控制器提升为主域控制器 ,把主域控制器降级为普通成员服务器:这种场景一般应用到原主域控制器进行系统升级(先转移域角色, ...