在Node开发中免不了要使用框架,比如expresskoakoa2拿使用的最多的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()就是通常所说的使用中间件那中间件是什么呢?它又有啥用呢?

中间件 middleware

一个请求发送到服务器后,它的生命周期是 先收到request(请求),然后服务端处理,处理完了以后发送response(响应)回去而这个服务端处理的过程就有文章可做了,想象一下当业务逻辑复杂的时候,为了明确和便于维护,需要把处理的事情分一下,分配成几个部分来做,而每个部分就是一个中间件

node.js - express 框架中的app.use是什么作用? - SegmentFault

app.use 加载用于处理http请求的middleware(中间件),当一个请求来的时候,会依次被这些 middlewares处理。中间件执行的顺序是你定义的顺序

那中间件到底是个什么东西呢?

中间件其是一个函数,在响应发送之前对请求进行一些操作

function middleware(req,res,next){
// 做该干的事 // 做完后调用下一个函数
next();
}

这个函数有些不太一样,它还有一个next参数,而这个next也是一个函数,它表示函数数组中的下一个函数

那函数数组又是什么呢

express内部维护一个函数数组,这个函数数组表示在发出响应之前要执行的所有函数,也就是中间件数组使用app.use(fn)后,传进来的fn就会被扔到这个数组里,执行完毕后调用next()方法执行函数数组里的下一个函数,如果没有调用next()的话,就不会调用下一个函数了,也就是说调用就会被终止

Express中间件的使用

理论部分简单的说了一下,现在来用代码验证一下,注意需要安装一下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的中间件是什么了,以及app.use的用法了,下面就来自己实现一下吧

实现简单的Express中间件

/**
* 仿照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内部维护的一个函数数组中去测试结果:

 
 

ok,相信对Express中间件的原理已经有所了解了,koa和koa2中间件的原理其实也是一样的

转自:https://www.jianshu.com/p/797a4e38fe77

Express中间件的原理及实现的更多相关文章

  1. Express中间件原理详解

    前言 Express和Koa是目前最主流的基于node的web开发框架,他们的开发者是同一班人马.貌似现在Koa更加流行,但是仍然有大量的项目在使用Express,所以我想通过这篇文章说说Expres ...

  2. Express中间件简单的实现原理

    上一篇理解Express的使用之后, 再总结一篇Express中间件的简单实现原理. 我们知道Express中间件就是一个个的函数, 那么怎么让这些函数有序的执行呢? 那就需要我们调用 next 函数 ...

  3. express中间件原理 && 实现

    一.什么是express中间件? 什么是express中间件呢? 我们肯定都听说过这个词,并且,如果你用过express,那么你就一定用过express中间件,如下: var express = re ...

  4. koa中间件系统原理及koa+orm2实践。

    koa是由 Express 原班人马打造的新的web框架.套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象. 这些中间件函数基于 request 请求以一个类似于栈 ...

  5. vue+webpack+express中间件接口使用

    环境:vue 2.9.3; webpack 目的:接口的调用 跨域方式: 1.express中间的使用 2.nginx代理 3.谷歌浏览器跨域设置 -------------------------- ...

  6. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

  7. 1.express中间件的简介

    express中间件的意思 1, 中间件是一个模块.在js中,模块意味着函数,所以中间件是一个函数.那么这个函数长什么样子? 这还要从中间件的功能说起,它拦截http 服务器提供的请求和响应对象,执行 ...

  8. express 中间件

    [express 中间件] 中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 ...

  9. Express中间件

    一.编写中间件 中间件函数能够访问请求对象(req),响应对象(res),应用程序的请求/响应循环中的下一个中间件函数.下一个中间件函数通常由名为next的变量来表示. 中间件函数可以执行以下任务: ...

随机推荐

  1. layui常见问题记录

    1.用js选中checkbox,没有效果 解决方式:加入 form.render(); 重新渲染表单 $(this).prop('checked', true); //在新版本的jquery中,如果是 ...

  2. (整理)plsql导入dmp文件

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/10093063.html 参考网址: https://www.2cto.com/database/20 ...

  3. 批量备份数据库脚本(PowerShell版)

    开始 昨天备份一个数据库拿来测试,发现备份后的文件非常大.后来去检查下使用的备份脚本,原来之前的备份脚本没有压缩功能. 现把之前的备份脚本修改下,支持压缩备份,和支持仅复制备份(CopyOnly). ...

  4. CentOS 7.x 用shell增加、删除端口

    一.在/usr/local/sbin/下创建port文件,不要扩展名,并给权限  chom 777 port #!/bin/bash num=$# ok=0 if [ ${num} == 1 ]; t ...

  5. R8500 MPv2 版本 刷梅林改版固件

    由于R8500折腾起来比较繁琐.并且国内的koolshare上已经有人释出梅林改版移植的固件,主要是***更方便了,所以把R8500刷成了梅林固件,这是我第一次用上梅林固件. 刷机整个过程参考了下面的 ...

  6. koa中间件机制详解

    转自:https://cnodejs.org/topic/58fd8ec7523b9d0956dad945 koa是由express原班人马打造的一个更小.更富有表现力.更健壮的web框架. 在我眼中 ...

  7. 关于在最新的 Visual Studio 2017 版本中使用 Web Deploy 遇到的 SSL 连接错误

    错误信息: 无法完成向远程代理 URL 发送请求.请求被中止: 未能创建 SSL/TLS 安全通道. 原因分析: 最新版本的 Visual Studio 中,已经抛弃了 https 协议中旧版 SSL ...

  8. 使用 Node.js 搭建API 网关

    外部客户端访问微服务架构中的服务时,服务端会对认证和传输有一些常见的要求.API 网关提供共享层来处理服务协议之间的差异,并满足特定客户端(如桌面浏览器.移动设备和老系统)的要求. 微服务和消费者 微 ...

  9. Renascence架构介绍——文件夹

    这一系列文章是为个人项目作一个介绍.有兴趣的朋友能够关注一下. https://github.com/jxt1234/Renascence 先写个文件夹.以后按文件夹更新 1.自己主动编程体系设想 2 ...

  10. 【Spark深入学习 -16】官网学习SparkSQL

    ----本节内容-------1.概览        1.1 Spark SQL        1.2 DatSets和DataFrame2.动手干活        2.1 契入点:SparkSess ...