Express:组成中间件

时间:2013-10-13 02:19:05

标签: node.js express

我想将一系列app.use()次调用转移到自己的模块中。封装它的最简单方法是在导出中公开function(app),但我觉得移交app对象太过于不透明的界面了。

我想从模块外部公开一个中间件app.use()'d。我需要链接/组合内部使用的中间件。

有没有时尚的方式来做这个或另类?最简单的方法是什么?我应该避免什么?

3 个答案:

答案 0 :(得分:2)

这个答案有点晚了,但是反正...

// composedMiddleware.js
const express = require('express')
const ware1 = (req, res, next)=>{...}
const ware2 = (req, res, next)=>{...}
const router = express.Router()
router.use(ware1)
router.use(ware2)
export default router

// app.js
const composedMiddleWare = require('./composedMiddleware.js')
app.get('/something', (req, res, next)=>{...})
app.get('/something', composedMiddleWare)

如果代码不是不言自明的,那么请注意路由器也是中间件。或者,更确切地说,“路由器的行为类似于中间件本身,因此您可以将其用作app.use()的参数” ref

答案 1 :(得分:1)

浏览Express(以及它所基于的Connect)的代码,似乎在一个中间件上调用use不会以任何方式通知任何内容,因此实际上没有办法编写东西没有通过app提前。

但是,您可以在运行时进行合成,例如第一次调用中间件时,将一些函数组合在一起并缓存/调用它们。

答案 2 :(得分:1)

这是我的看法:

// app.js
...
app.use(require('./middleware')());
...

// middleware.js
var express    = require('express');    
module.exports = function() {
  var middleware = [
    // list of middleware that you want to have performed:
    function mymiddleware(req, res, next) {
      console.log('hello world');
      next();
    },
    express.logger('dev'),
    express.cookieParser(),
    express.static(__dirname)
  ];
  return function(req, res, next) {
    (function iter(i, max) {
      if (i === max) {
        return next();
      }
      middleware[i](req, res, iter.bind(this, i + 1, max));
    })(0, middleware.length);
  };
};

如果您需要访问自定义中间件中的应用,可以通过req.appres.app访问该应用。