Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js中编写中间件类_Javascript_Node.js_Class_Middleware - Fatal编程技术网

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

Javascript 如何在Node.js中编写中间件类,javascript,node.js,class,middleware,Javascript,Node.js,Class,Middleware,我已经在Google和books上研究了几个小时这个主题,我只能找到非常具体的实现。我正在努力在NodeJS中编写一个简单的中间件类,只使用普通的javascript(没有像async、co等附加模块)。我的目标是了解它是如何工作的,而不是获得最优化的代码 我想要一些简单的东西,比如拥有一个字符串并通过使用中间件向其添加新字符串 班级 "use strict"; class Middleware { constructor() { this.middlewares = [

我已经在Google和books上研究了几个小时这个主题,我只能找到非常具体的实现。我正在努力在NodeJS中编写一个简单的中间件类,只使用普通的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;
可能的用法

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');

结果,msg变量将变成:“helloworld!!!”

适用于那些正在寻找工作示例的人

// 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'});

公认的答案有几个问题,即未使用/未使用的变量。另外,我想发布一个备选答案,因为这就是stackexchange的目的

用法示例是相同的


你到底在挣扎什么?(为什么)你需要这个课程?@thomas@jfriend00出于教育目的,我把这个例子做得非常简单,但实际上它是一个更大的课程的一部分。我需要这个中间件模式,以便根据用户输入信息扩充JS对象,并收集一些数据以将其保存在数据库中。我实际上正在努力解决的是ExecuteMidware方法内部的逻辑问题。我尝试循环遍历中间件数组并调用每个函数
中间件。调用(this,arg,next)
问题是,中间件之间的数据不存在。最后一个中间件接收“Hello”而不是“Hello World”。@Thomas我已经按照您的建议实现了executeMiddleware方法,但是最后一个中间件接收未定义的消息。跟踪:
最终消息:未定义!!!最初的信息是:你好
@Thomas,我看到了这条评论。如果我有一个解决方案,我会在这里分享。“但是我仍然被这个问题困扰着。”“托马斯,如果你有一个解决方案,它将极大地指导我。”。我似乎无法理解这件事。关于单个api资源/端点的使用示例如何?例如,如果我在一个api“控制器”中有5个资源,我只想对5个资源中的2个应用某些中间件逻辑。对于基于函数的中间件,我会使用如下内容:
app.post('/item',middlewareOnlyForThisResource,(req,res,next)=>…
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));
  }
}