Express Middleware

2019-01-09  本文已影响0人  anOnion

今天讲一下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了。

至此,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。

我自己开发的时候也经常用到自定义的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开发,真是太庆幸了。(希望不要拉仇恨)

上一篇下一篇

猜你喜欢

热点阅读