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

Blu*_*dge 5 javascript middleware class node.js

我在谷歌和书籍上研究了这个主题几个小时,但我只能找到非常具体的实现。我正在努力在 Node JS 中仅使用普通的 JavaScript 编写一个简单的中间件类(没有像 async、co 等附加模块)。我的目标是了解它是如何工作的而不是获得最优化的代码。

我想要像拥有一个字符串并通过使用中间件向其中添加新字符串一样简单的东西。

班上

"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;
Run Code Online (Sandbox Code Playgroud)

可能的用法

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');
Run Code Online (Sandbox Code Playgroud)

结果,msg 变量最终将变为:“Hello World !!!”

Blu*_*dge 6

对于那些寻找工作示例的人。

// 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;
Run Code Online (Sandbox Code Playgroud)

使用示例:

// 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'});
Run Code Online (Sandbox Code Playgroud)