美文网首页
Express Middleware

Express Middleware

作者: anOnion | 来源:发表于2019-01-09 20:26 被阅读0次

    今天讲一下Express相关知识。Express是NodeJS里最出名的一个web框架(没有之一)。它以极轻量级闻名于世,如果高度总结Express方法的话,它仅仅就两部分组成:路由(routing)和中间件(middleware)。今天就简单介绍一下middleware的使用方法。

    express方法

    如下所示,是express 方法定义和一个简单的示例:

    app.METHOD(ROUTING, MIDDLEWARE1, MIDDLEWARE2, ...);
    

    app.METHOD()方法的第一个参数是api的路径(路由),之后的不定参就是一串middleware方法。

    cosnt express = require('express');
    let app = express();
    
    app.get('/routing', //路由
        function middleware1(req, res, next) { //中间件1
            console.log('Be invoked firstly.')
            next();
        },
        function middleware2(req, res,next) { //中间件2
            res.send('Hello world!');
            next(); //won't work.
        },
        function middleware3(req, res,next) {
            console.log('Not be invoked!');
        }
    )
    

    如上所示,当express获取api请求后,依次运行middleware1,middleware2,middleware3……这里middleware1打印完一串字符后,调用next()方法,express会接着往下运行middleware2;middleware2直接向response发送了Hello world!,然后整个请求就结束了,尽管后面还有next()方法,但也不会再调用middleware3了。

    • How middleware works

    至此,Express框架的大体使用方式就讲解完了。(,不知道该讲啥了……)

    Use middleware

    除了一般的postget等方法,app.use也可以用到middleware。

    let logger = (req, res, next) => {
        console.log('LOGGED');
        next();
    }
    
    app.use(logger);
    
    app.get('/api', (req, res) => {
        res.send('Hello world!');
    })
    

    Middleware是按顺序加载的,如上所示:app.use(logger)app.get()之前,所以每次app接受到请求后,都会先打印一个LOGGED,再返回Hello world。这里,假如app.use(logger)出现在app.get()之后,那就不会打印LOGGED,因为app.get()直接返回了消息,并没有调用next()

    3rd Party

    现实开发中我们还会用到很多express的三方库,主要原理都是use各种自定义的middleware。

    • expressjs/compression: 用来压缩所有返回的数据,可选deflate或gzip。

      // compress responses
      app.use(compression())
      
    • expressjs/body-parser: 解析body里的data数据

      // parse application/x-www-form-urlencoded
      app.use(bodyParser.urlencoded({ extended: false }))
      
      // parse application/json
      app.use(bodyParser.json())
      

    我自己开发的时候也经常用到自定义的middleware。上一期写的Log with Async Hooks就是通过middleware加到web应用里的:只需在所有app.METHOD调用前获取请求头里的tenant信息,随后所有的log里就有tenant了。一个简单的MT web service就成型了。

    app.use((req, res, next) => {
        let asyncId = async_hooks.executionAsyncId();
        contex.set(asyncId, req.headers.tenant)
        next();
    });
    
    

    小结

    Express常年保持Node后端框架No.1的地位,下图是2018年的趋势分布。预计数年内这个趋势不会有太大的变化。我经历过Java Spring的开发,记得刚入职的时候被Spring各种配置恶心许久,至今心有余悸;现在能得闲做express开发,真是太庆幸了。(希望不要拉仇恨)

    • 2018 Javascript Back-end Frameworks

    相关文章

      网友评论

          本文标题:Express Middleware

          本文链接:https://www.haomeiwen.com/subject/alqnrqtx.html