【问题标题】:Grouping and Managing node.js Middleware分组和管理 node.js 中间件
【发布时间】:2013-01-14 12:19:18
【问题描述】:

如果我制作了一些可以协同工作的中间件,那么对功能进行分组和管理的最佳约定是什么?

在我的server.js 文件中,我目前只是通过app.use 调用一个接一个地列出它们。

然而,我突然想到,如果我的集合中的第一个没有产生任何数据,那么该组中的后续数据可以跳过。我想这最终是一个聚合,虽然我在其他项目中没有看到任何这样的例子。

【问题讨论】:

    标签: node.js express connect middleware


    【解决方案1】:

    connect 中间件有一个很好的例子来解决这类问题。看看bodyParser

    app.use(connect.bodyParser());  // use your own grouping here
    

    等价于

    app.use(connect.json());
    app.use(connect.urlencoded());
    app.use(connect.multipart());
    

    在内部,bodyParser 函数只是将 reqres 对象传递给前面提到的每个中间件函数

    exports = module.exports = function bodyParser(options){
      var _urlencoded = urlencoded(options)
        , _multipart = multipart(options)
        , _json = json(options);
    
      return function bodyParser(req, res, next) {
        _json(req, res, function(err){
          if (err) return next(err);
          _urlencoded(req, res, function(err){
            if (err) return next(err);
            _multipart(req, res, next);
          });
        });
      }  
    };
    

    完整代码可以在github上找到repo

    【讨论】:

      【解决方案2】:

      编辑

      在下面的 cmets 中得知,传递一个数组将获得完全相同的结果,因此不需要额外的模块。 :-)


      我也在寻找一种方法来执行此操作,因为我的应用程序非常精细,但我不想像其他答案那样嵌套所有内容。

      我确信那里已经有更全面的东西,但我最终做到了:

       /**
       * Macro method to group together middleware.
       */
      function macro (...middlewares) {
          // list of middlewares is passed in and a new one is returned
          return (req, res, next) => {
              // express objects are locked in this scope and then
              // _innerMacro calls itself with access to them
              let index = 0;
              (function _innerMacro() {
                  // methods are called in order and passes itself in as next
                  if(index < middlewares.length){
                      middlewares[index++](req, res, _innerMacro)
                  } else {
      
                      // finally, next is called
                      next();
                  }
              })();
          }
      }
      

      然后像这样使用它:

      var macro = macro(
          middleware1,
          middleware2,
          middleware3
      );
      
      app.post('/rout', macro);
      

      【讨论】:

      • 或者只是app.post('/rout', middleware1, middleware2, middleware3),或者let mw = [ middleware1, middleware2, middleware3 ]; app.post('/rout', mw)(以便于重复使用)
      • 第一个例子正是我试图避免的,因为我以这种方式结束了很多重复,但我不知道你可以使用数组。非常好,谢谢。
      • 现在我知道为什么没有什么可做的了,它一直是内置的! :-)
      • 原来的问题已经很老了,所以也许当时还不能传递中间件数组:D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2016-11-27
      • 2014-08-05
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多