如何在Node.js中编写一个中间件类

我已经在Google和书籍上研究了几个小时的话题,而且我只能find非常具体的实现。 我正在努力编写一个简单的中间件类在节点JS只有普通香草的JavaScript(没有像async,co,额外的模块..)。 我的目标是了解它如何工作,而不是获得最优化的代码。

我想要一些简单的东西,比如有一个string,并通过使用中间件来添加新的string。

class上

"use strict"; class Middleware { constructor() { this.middlewares = []; } use(fn) { this.middlewares.push(fn); } executeMiddleware(middlewares, msg, next) { // This is where I'm struggling } run(message) { this.executeMiddleware(this.middlewares, message, function(msg, next) { console.log('the initial message : '+ message); }); } } module.exports = Middleware; 

一个可能的用法

 const Middleware = require('./Middleware'); const middleware = new Middleware(); middleware.use(function(msg, next) { msg += ' World'; next(); }); middleware.use(function(msg, next) { msg += ' !!!'; console.log('final message : ' + msg); next(); }); middleware.run('Hello'); 

结果msgvariables最终会变成:'Hello World !!!'

对于那些正在寻找一个工作的例子。

 // MIDDLEWARE CLASS "use strict"; let info = { msg: '' }; class Middleware { constructor() { this.middlewares = []; } use(fn) { this.middlewares.push(fn); } executeMiddleware(middlewares, data, next) { const composition = middlewares.reduceRight((next, fn) => v => { // collect next data info = data; fn(info, next) }, next); composition(data); } run(data) { this.executeMiddleware(this.middlewares, data, (info, next) => { console.log(data); }); } } module.exports = Middleware; 

用法示例:

 // index.js const Middleware = require('./Middleware'); const middleware = new Middleware(); middleware.use(function(info, next) { info.msg += ' World'; next(); }); middleware.use(function(info, next) { info.msg += ' !!!'; next(); }); // Run the middleware with initial value middleware.run({msg: 'Hello'}); 

接受的答案有几个问题,即未使用/不需要的variables。 也就像发布一个替代的答案,因为这是什么stackexchange是。

用法示例是一样的

 class Middleware { constructor() { this.middlewares = []; } use(fn) { this.middlewares.push(fn); } executeMiddleware(data, done) { this.middlewares.reduceRight((done, next) => () => next(data, done), done) (data); } run(data) { this.executeMiddleware(data, done => console.log(data)); } }