javascript - express中,app.use()原理问题
天蓬老师
天蓬老师 2017-04-11 10:06:40
[JavaScript讨论组]

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(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中的中间件机制其实不是很复杂,建议楼主直接看看源码

ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号