中间件(middleware),就是处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、分析数据、以及其他在需要最终将数据发送给用户之前完成的任务。

分类

  • 内置中间件(static)
  • 自定义中间件
  • 第三方中间件 (body-parser)
  1. 自定义中间件

在我们日常的项目开发中,前端每次请求接口的时候,后端都邀请发送token,如果不带token的话,不能够完成请求。

所以呢,就出现了下面这些判断。

const express = require ('express');
let app = express();

app.get('/test1' , ( req , res ) => {
    let {token} = req.query;
    console.log('test1')
    if(token) {
        res.send('ok')
    } else {
        res.send('身份验证失败');
    }
});

app.get('/test2' , ( req , res ) => {
    console.log('test2');
    let {token} = req.query;
    if(token) {
        res.send('ok')
    } else {
        res.send('身份验证失败');
    }
});

app.listen( 3000 , () => {
    console.log('3000 is running');
});

但是呢,在日常的项目开发中,后端至少要写几十个接口,虽然说可以通过复制粘贴来完成,

但是在代码优化和接口性能上就会有些差强人意,这个时候我们就可以通过中间件来处理这些烦人的操作。

app.use() 里面使用的参数,主要是函数。但这个使用,并不是函数调用,而是使能的意思。当用户在浏览器发出请求的时候,这部分函数才会启用,进行过滤、处理。

第一个参数是路径第二个参数是一个回调函数,回调函数中有req ,res,next 。

const express = require ('express');
let app = express();

app.use( '/' , (req , res ,next) => {
    console.log('中间件');
});

app.get('/test1' , ( req , res ) => {
    let {token} = req.query;
    console.log('test1')
    if(token) {
        res.send('ok')
    } else {
        res.send('身份验证失败');
    }
});

app.get('/test2' , ( req , res ) => {
    console.log('test2');
    let {token} = req.query;
    if(token) {
        res.send('ok')
    } else {
        res.send('身份验证失败');
    }
});

app.listen( 3000 , () => {
    console.log('3000 is running');
});

在加入中间件以后,继续在浏览器中请求这两个接口,发现没有无法请求了,在终端打印一下,发现中间件中的内容是可以输出的。因此说明在执行完中间件以后,就没有向下执行。

其实这个中间件的作用在于请求/开头的路径时,优先会走中间件的回调函数,中间件的回调函数中的next()表示是否继续向下走,有nex()表示向下执行,没有则表示执行结束。

这个时候,我们可以在中间件中加入next()进行尝试。

###### 尝试结果如下:

image-20200114160854728

诶,现在可以跑通了。

跑通以后前面的疑问就解决了吧,因为每个请求/开头的路径时,都要经过中间件,那么我们只需要在中间件中进行判断就好了,不需要在每一个中都进行判断,前面提到的代码冗余问题和性能问题就这样解决了。

const express = require ('express');
let app = express();

app.use( '/' , (req , res ,next) => {
    let {token} = req.query;
    console.log('中间件');
    if (token) {
        res.send('ok')
    } else {
        res.send('身份验证失败');
    }
    next();
});

app.get('/test1' , ( req , res ) => {
    console.log('test1');
});

app.get('/test2' , ( req , res ) => {
    console.log('test2');
});

app.listen( 3000 , () => {
    console.log('3000 is running');
});
  1. 内置中间件(static)

在nignx中,我们可以指定一个静态的资源目录,express中也是可以的。

要想随意的使用这些中间件,我们需要掌握一丢丢node内置模块path的知识。

path知识

const express = require ('express');
const path = require ('path');
const app = express();

app.use(express.static(path.join(__dirname , './www')));

app.listen( 3002 , () =>{
    console.log('3002 is running');
});

运行完成以后就可以把自己写好的网站放进去,在浏览器中访问就可以了。

Last modification:January 17th, 2020 at 09:33 pm
来杯coffee吧