express中,app.use()原理问题

对于node开发来说,对express应该都是使用很多的,但是它就像一个黑匣子一样,并不知道内部的情况。
var app=new express(); app.use('中间件')这句的原理是怎样的,要是自己模拟,要如何实现那?

阅读 3.6k
2 个回答

简单说下express的中间件机制:


// 定义一个空数组,存放我们所有的`中间件`
const middlewares = [];

// 定义app的use方法
app.use = function(middleware) {
    // 每次use一个新的中间件(其实就是一个函数),实际上是往middlewares数组中添加该middleware
    middlewares.append(middleware);
}

/*
    中间件的代码其实就是上面写的那么简单(当然我简化了很多,但是思想就是这么一回事)
    接下来我们来聊聊中间件是如何起作用的
*/


// 首先记住每个middleware的形式如下
function(req, res, next) {

}

// 假设现在我们有两个中间件m1, m2如下
const m1 = function(req, res, next) {
    req.m1 = 'm1';
    next();
}
const m2 = function(req, res, next) {
    res.m2 = 'm2';
    next();
}

/*
    当一个请求到来的时候
    1. 中间件机制会先执行m1函数,然后对req和res做一些操作
    2. m1执行到最后的时候会调用`next()`,在这里也就是m2,也就是说调用`next()`的时候实际上调用m2函数
    3. m2重复上面的操作,调用它之后的中间件,直到你的业务代码
    4. 通过上述中间件,你的业务代码可以获取额外的req和res的属性,也就是上面列出的req.m1和res.m2
*/

一点说明:
express中的next()的调用其实是不带req,res,next这些参数的,之所以可以这样,是因为它对每个middleware函数做了一些修改,拿上面的m1函数来说,它的next其实可以想成做了如下处理next = m2.bind(req, res, m2后的下一个middleware)

ps: 换个角度思考,中间件其实就是对req, res这两个对象的属性加以增强的函数而已

pps: express中的中间件机制其实不是很复杂,建议楼主直接看看源码

如果想了解的话可以看下connect的源码,200来行,express基于connect

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题