实现一个简易的express中间件
代码:
// 通过闭包实现单例
const Middlewave = (function(){
let instance;
class Middlewave{
constructor() {
this.stack = []; // 中间件调用栈
return instance || (instance = this); // 返回单例
}
// 注册中间件
use(...funcs) {
// 将中间件push到stack调用栈中
funcs.forEach(func => this.stack.push(func));
}
// 调用下一个中间件
next() {
if (this.stackCopy[0]) {
// 取出当前中间件
const curWave = this.stackCopy.shift();
// 执行当前中间件
// next绑定this,防止this指向被修改
curWave(this.req, this.res, this.next.bind(this));
}
}
init(req, res) {
this.req = req;
this.res = res;
// 复制一份中间件调用栈调用栈
this.stackCopy = this.stack.map(item => item);
// 执行下一步
this.next();
}
}
return Middlewave;
})();
测试:
const app = new Middlewave();
function middlewave_a(req, res, next) {
req.a = true;
res.a = true;
console.log('a', req, res);
next();
}
function middlewave_b(req, res, next) {
req.b = true;
res.b = true;
console.log('b', req, res);
next();
}
function middlewave_c(req, res, next) {
req.c = true;
res.c = true;
console.log('c', req, res);
}
function middlewave_d(req, res, next) {
req.d = true;
res.d = true;
console.log('d', req, res);
next();
}
app.use(middlewave_a);
app.use(middlewave_b);
app.use(middlewave_c);
app.use(middlewave_d);
app.init({name: 'a'}, { name: 'a'});
app.init({name: 'b'}, { name: 'b'});
app.init({name: 'c'}, { name: 'c'});
结果:

实现一个简易的express中间件的更多相关文章
- express中间件系统的基本实现
一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品.今天就来实现一个简易的[中间件队列]. 一. API ...
- 【nodejs原理&源码赏析(1)】Express中间件系统的基本实现
一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品.今天就来实现一个简易的[中间件队列]. 一. API ...
- express中间件原理 && 实现
一.什么是express中间件? 什么是express中间件呢? 我们肯定都听说过这个词,并且,如果你用过express,那么你就一定用过express中间件,如下: var express = re ...
- Node:使用express搭建一个简易的服务器
①安装node环境 在node.js官网下载LTS长期支持版本,然后傻瓜式安装 ②查看是否安装成功 打开cmd终端,输入node -v 有版本号,则安装成功.再输入npm -v 有版本号,则npm也安 ...
- express + mongodb 搭建一个简易网站 (四)
express + mongodb 搭建一个简易网站 (四) 目前网站整体页面都已经能全部展示了,但是,整个网站还有两个块需要做完才能算完整,一个连接数据库,目前网站上的数据都是抓取的本地假数据,所以 ...
- express + mongodb 搭建一个简易网站 (三)
express + mongodb 搭建一个简易网站 (三) 前面已经实现了基本的网站功能,现在我们就开始开搞一个完整的网站,现在整个网站的UI就是下面的这个样子. 我们网站的样子就照着这个来吧. 1 ...
- express + mongodb 搭建一个简易网站(二)
express + mongodb 搭建一个简易网站 (二) 在搭建网站(一)中,实现了简单的路由功能,这离一个完整的网站还差的有点远,继续撸代码吧. 1.首先在根目录下新建一个views文件夹,用来 ...
- express + mongodb 搭建一个简易网站(一)
express + mongodb 搭建一个简易网站(一) 前言:后台使用node.js的express框架,数据库使用mongodb,模板使用ejs.大概就这些. 开始第一个简易网站之旅吧.... ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
随机推荐
- Log.d 日志调试查看(所有平台)
https://www.cnblogs.com/onechen/p/6436748.html http://docwiki.embarcadero.com/Libraries/Berlin/en/FM ...
- tensorflow 学习笔记-- tf.reduce_max、tf.sequence_mask
1.tf.reduce_max函数的作用:计算张量的各个维度上的元素的最大值.例子: import tensorflow as tfmax_value = tf.reduce_max([1, 3, 2 ...
- better-scroll的使用
<template> <div> <div> <h2 class="h2">{{msg}}</h2> </div& ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- Linux基础学习二
新建分区:fdisk /dev/sda(a代表第一块硬盘) 建完后w保存 更新分区表:partprobe mkfs.ext4 /dev/sdb{1..3} : 格式 ...
- 201621123082《Java程序设计》第1周学习总结
1. 本周学习总结: 关键词: 了解Java语言的发展历史.了解Java语言的特点.JDK.JRE.JVM.eclipse等. 联系: JDK是提供给Java开发人员使用的一组工具,JDK包含JVM及 ...
- 模板 求GCD&LCM
求最大公倍数 int GCD(int a,int b) { ) return b; else return GCD(b,a%b); } 求最小公倍数 int LCM(int a,int b) { re ...
- 笔记——collections模块
collections模块 collections模块在内置数据类型(dict.list.set.tuple)的基础上,还提供了几个额外的数据类型:ChainMap.Counter.deque.def ...
- sql server 数据库 杀掉死锁进程
use mastergo--检索死锁进程select spid, blocked, loginame, last_batch, status, cmd, hostname, program_namef ...
- 第一个web项目
1) 创建Java Web Project 2) 创建相应的包 3) 创建类并继承于HttpServlet 4) 重写service()方法 5) ...