express
、koa
、koa2
拿使用的最多的express
来举例子开发中确定会用到不少相似于下面的这种代码
var express = require('express'); var app = express(); app.listen(3000, function () { console.log('listen 3000...'); }); app.use(middlewareA); app.use(middlewareB); app.use(middlewareC);
对我要说的就是app.use()
为何要说这个?由于面试时被问到了。。。
哦 你用过Express啊 来来来 那你说说app.use的原理是什么?
一脸懵逼...0.0
app.use()
就是一般所说的使用中间件那中间件是什么呢?它又有啥用呢?
node.js - express 框架中的app.use是什么做用? - SegmentFaultapp.use 加载用于处理http请求的middleware(中间件),当一个请求来的时候,会依次被这些 middlewares处理。中间件执行的顺序是你定义的顺序
function middleware(req,res,next){ // 作该干的事 // 作完后调用下一个函数 next(); }
这个函数有些不太同样,它还有一个next参数,而这个next也是一个函数,它表示函数数组中的下一个函数
app.use(fn)
后,传进来的fn
就会被扔到这个数组里,执行完毕后调用next()
方法执行函数数组里的下一个函数,若是没有调用next()
的话,就不会调用下一个函数了,也就是说调用就会被终止
express
/** * express中间件的实现和执行顺序 * * Created by BadWaka on 2017/3/6. */ var express = require('express'); var app = express(); app.listen(3000, function () { console.log('listen 3000...'); }); function middlewareA(req, res, next) { console.log('middlewareA before next()'); next(); console.log('middlewareA after next()'); } function middlewareB(req, res, next) { console.log('middlewareB before next()'); next(); console.log('middlewareB after next()'); } function middlewareC(req, res, next) { console.log('middlewareC before next()'); next(); console.log('middlewareC after next()'); } app.use(middlewareA); app.use(middlewareB); app.use(middlewareC);
输出结果:
next()
以后的部分
/** * 仿照express实现中间件的功能 * * Created by BadWaka on 2017/3/6. */ var http = require('http'); /** * 仿express实现中间件机制 * * @return {app} */ function express() { var funcs = []; // 待执行的函数数组 var app = function (req, res) { var i = 0; function next() { var task = funcs[i++]; // 取出函数数组里的下一个函数 if (!task) { // 若是函数不存在,return return; } task(req, res, next); // 不然,执行下一个函数 } next(); } /** * use方法就是把函数添加到函数数组中 * @param task */ app.use = function (task) { funcs.push(task); } return app; // 返回实例 } // 下面是测试case var app = express(); http.createServer(app).listen('3000', function () { console.log('listening 3000....'); }); function middlewareA(req, res, next) { console.log('middlewareA before next()'); next(); console.log('middlewareA after next()'); } function middlewareB(req, res, next) { console.log('middlewareB before next()'); next(); console.log('middlewareB after next()'); } function middlewareC(req, res, next) { console.log('middlewareC before next()'); next(); console.log('middlewareC after next()'); } app.use(middlewareA); app.use(middlewareB); app.use(middlewareC);
JS是一门神奇的语言,这里用到了两个闭包,而且给app这个函数添加了一个use方法,函数也是能够有属性的原理就是每调用一次use,就把传进来的函数扔到express内部维护的一个函数数组中去测试结果:
转自:https://www.jianshu.com/p/797a4e38fe77
javascript