express中间件分成三种

内置中间件 static

自定义中间件
第三方中间件 (body-parser) (拦截器)

全局自定义中间件
在请求接口时 有几个接口都要验证传来的内容是否存在或者是否正确 不可能每个接口都写一段验证,所以这一段验证可以提取出来,通过中间件实现
const express = require("express");
const app = express(); // test1接口
app.get("/test1",(req,res) => {
res.send("test1 ok")
})
// test2接口
app.get("/test2",(req,res) => {
res.send("test2 ok")
})
// 开启服务器
app.listen(2000,() => {
console.log('开启在2000端口');
})
现在要做的是在请求test1和test2的时候 看请求中有没有带上需要的字段 token
app.use()
第一种中间件 可以说是拦截器
第一个参数是路径 第二个参数是回调函数 回调函数中有req res next
const express = require("express");
const app = express(); app.use("/",(req,res,next)=>{
console.log("中间件")
})
// test1接口
app.get("/test1",(req,res) => {
console.log('test1');
res.send("test1 ok")
})
// test2接口
app.get("/test2",(req,res) => {
console.log('test2');
res.send("test2 ok")
})
// 开启服务器
app.listen(2000,() => {
console.log('开启在2000端口');
})

现在在浏览器中请求/test1 没有响应,在终端中打印出来

这个中间件的作用在于 请求/开头的路径时 优先走中间件的回调函数 中间件里的next()表示是否继续往下执行 ,有next()就继续往下走, 没有next()就不往下走

const express = require("express");
const app = express(); app.use("/",(req,res,next)=>{
console.log("中间件")
next() // 是否继续往下执行
})
// test1接口
app.get("/test1",(req,res) => {
console.log('test1');
res.send("test1 ok")
})
// test2接口
app.get("/test2",(req,res) => {
console.log('test2');
res.send("test2 ok")
})
// 开启服务器
app.listen(2000,() => {
console.log('开启在2000端口');
})

页面中

终端打印

简单来说 在来到/test1接口之前 有个拦截器,这个拦截器中的路径是/, 所有的接口都先走这个拦截器,在这个拦截器里做逻辑处理,允许它继续往下走就加next() ,不允许往下走就不用加next(), 因此验证上文提到的token,就可以在中间件里进行

const express = require("express");
const app = express(); app.use("/",(req,res,next)=>{
console.log("中间件")
let {token} = req.query;
if(token){
next() // 是否继续往下执行
}else{
res.send("缺少token")
}
})
// test1接口
app.get("/test1",(req,res) => {
console.log('test1');
res.send(`test1 token为${req.query.token}`)
})
// test2接口
app.get("/test2",(req,res) => {
console.log('test2');
res.send(`test2 token为${req.query.token}`)
})
// 开启服务器
app.listen(2000,() => {
console.log('开启在2000端口');
})

浏览器中访问/test1 不带token字段

现在带上token字段访问/test2

这就实现了通过中间件做全局拦截,这种中间件属于自定义拦截器.如果app.use()的第一个参数是 / 表示路径,则第一个参数可以不写,如下

app.use("/",(req,res,next)=>{
next() // 是否继续往下执行
})

等同于

app.use((req,res,next)=>{
next() // 是否继续往下执行
})

这也可以说为什么body-parser是一个中间件

const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
在使用bodyParser.json()的时候也是在app.use()方法里跟了一个函数。
中间件的使用 在app.use()里 可以加上一个回调函数,在回调函数里做一些处理 需要注意的是在合适的时机 使用next()继续执行后面的操作
为什么说这一种是全局的 ,因为所有的接口都走这里 接下来看局部中间件
局部中间件
第一个参数还是路径 第二个参数是一个function 第三个参数还是function
const express = require("express");
const app = express(); app.get("/demo",(req,res,next) => {
console.log('fun1');
},(req,res) => {
console.log('fun2');
})
// 开启服务器
app.listen(2000,() => {
console.log('开启在2000端口');
})
现在请求/demo接口 浏览器中没有响应 因为第一个回调函数里没有next() 不会走到第二个回调函数里
终端打印

在第一个回调函数中加上next()看看

const express = require("express");
const app = express(); app.get("/demo",(req,res,next) => {
console.log('fun1');
next()
},(req,res) => {
res.send("fun2")
console.log('fun2');
})
// 开启服务器
app.listen(2000,() => {
console.log('开启在2000端口');
})

浏览器中访问/demo

终端打印

这种叫局部中间件,局部中间件是 在哪个接口里写就只对哪个接口有用,局部中间件可以写无数个 只要在合适的地方使用next()就可以一个接一个的往下执行,一般情况下使用局部中间件最多使用一两个就够了 使用多个局部中间件 代码结构如下

app.get("/test",fun1,fun2,fun3,fun4,fun5..)

内置中间件 static 又叫静态资源目录
类似于apache的静态目录 指定目录后把图片 网页 文件放进去 直接可以访问到
在项目目录新建一个文件夹 public 随便起名,用作静态资源目录
只要是中间件都是用app.use()方法
app.use(express.static("./public"))

在public目录下新建一个index.html文件 写上内容

浏览器访问/index.html

这样是直接访问静态目录,如果在public目录下还有目录,在浏览器中地址栏/后输入public下的目录的文件也可以访问到
还有另一种写法
app.use("/",express.static("./public"))
访问的地址不变 依然可以打开页面,因为路径名字是/时 第一个参数可以省去
如果想定义用户输入的路径 就改第一个参数
app.use("/public/test/",express.static("./public"))

浏览器访问时应该输/public/test/index.html了

总结 在express中 无论是app.get 还是app.post app.use 只要方法里第一个参数有路径 都会和浏览器访问的路径做对比 如果匹配上了就走当前的方法
如果在app.use 和 app.get app.post 的第一个参数中 有相同的路径 ,当用户访问时会优先走到app.use()的方法里 因为app.use()是一个拦截器

nodejs之express的中间件的更多相关文章

  1. 【nodejs】--express的中间件multer实现图片文件上传--【XUEBIG】

    Multer是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件.该中间件不处理multipart/form-data数据格式以外的任何形式的数据 Tips ...

  2. 77.深入理解nodejs中Express的中间件

    转自:https://blog.csdn.net/huang100qi/article/details/80220012 Express是一个基于Node.js平台的web应用开发框架,在Node.j ...

  3. nodejs之express中间件cookie-parser使用

    知识点: * .domain的使用,.aaa.com的域名都共享这个cookie信息 * res.cookie(,domain:'.aaa.com'}); * .获取所有cookie,设置cookie ...

  4. nodejs的express使用介绍

    Express框架 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 概述 运行原理 底层:http模块 什么是中间件 use方法 Express的方法 all ...

  5. nodejs学习--express篇

    express篇:http://www.runoob.com/nodejs/nodejs-express-framework.html Express 提供了内置的中间件 express.static ...

  6. NodeJS 框架 Express 从 3.0升级至4.0的新特性

    NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...

  7. [转] NodeJS框架express的途径映射(路由)功能及控制

    NodeJS框架express的路径映射(路由)功能及控制 我们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和route co ...

  8. nodejs之express的使用

    Express是目前最流行的基于Node.js的Web开发框架,可以快速的搭建一个完整功能的网站. Express框架建立在内置的http模块上,http模块生成服务器的原始代码如下. var htt ...

  9. 单页面应用的History路由模式express后端中间件配合

    这篇文章主要分享一下通过HTML5的history API的时候,使用NodeJS后端应该如何配置,来避免产生404的问题,这里是使用的express的框架,主要是通过connect-history- ...

随机推荐

  1. openresty开发系列15--lua基础语法4表table和运算符

    openresty开发系列15--lua基础语法4表table和运算符 lua中的表table 一)table (表)Table 类型实现了一种抽象的"关联数组".即可用作数组,也 ...

  2. php报错syntax error, unexpected T_GOTO, expecting T_STRING,报错文件与行数指向以下代码,是什么原因?

    本机php版本是5.3.8,Apache/2.2.21public function goto($url, $msg=NULL) {if ($msg) {$this->jsAlert($msg) ...

  3. ByteBuf使用实例

    之前我们有个netty5的拆包解决方案(参加netty5拆包问题解决实例),现在我们采用另一种思路,不需要新增LengthFieldBasedFrameDecoder,直接修改NettyMessage ...

  4. 代理类和AOP

    客户端不用调用目标对象了,直接调用代理类.最终目标方法还是去实行了. 代理类的每个方法调用目标类的相同方法,并且在调用方法时候加上系统功能的代码 代理和目标实现了相同的接口,有相同的方法.通过接口进行 ...

  5. Swift细节记录<一>

    1.全局变量记录: import UIKit class HHTSwitchGlobalData: NSObject { var isWaiterAutoPop: Bool = true privat ...

  6. MySQL普通索引性能试验

    首先使用如下node.js脚本创建两张表,并为这两张表各自生成10000条数据: var fs = require('fs'); var nameS = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱 ...

  7. shell脚本双引号、大括号、if语句注意事项

    1.双引号的问题 变量用双引号括起来的意义 如果变量不用双引号括起来,比如echo $a,那么隐含的意义就是,把$a变量的字符串,按照空格.制表符.换行符等符号来分割开.然后把这些分割后的每一项再按 ...

  8. Web书写Test Case时需要考虑的检查点

    通常书写Test Case时需要考虑的检查点: 一. 对于屏幕显示来说包括:1.检查显示的布局:2.检查域和按钮的顺序:3.检查域的尺寸:4.检查字体的大小和风格:5.检查文本的含义:6.检查拼写错误 ...

  9. Flutter 一些常用第三方库、插件

    网络请求 http ^0.12.0+2 https://pub.dev/packages/http https://github.com/dart-lang/http 该软件包包含一组高级函数和类,可 ...

  10. C# 人工智能开源库生物特征

    C# 人工智能开源库生物特征 Machine learning made in a minute http://accord-framework.net/ Accord.NET是AForge.NET框 ...