代码之家  ›  专栏  ›  技术社区  ›  lonix

将Express中间件移动到单独的模块

  •  0
  • lonix  · 技术社区  · 7 年前

    我有很多 app.use(...) 在我的express应用程序中,它们变得凌乱复杂,到处都是配置。所以我想把它们转移到单独的模块中,这样它们更容易测试。

    所以我有这个 Middleware.ts 我的中间件包装器的基类:

    export default abstract class Middleware {
    
      public run(): express.RequestHandler {
        try {
          return this.runImpl;
        }
        catch (err) {
          log("Failed to init middleware " + err);
          throw err;
        }
      }
    
      public abstract runImpl(): express.RequestHandler;
    
    }
    

    和一个子类,例如。 StaticMiddleware.ts 对于提供静态文件:

    export class StaticMiddleware extends Middleware {
    
      public runImp(): express.RequestHandler {
        // this is a simple example, but most middleware are more
        // complicated, but everything is encapsulated here
        return express.static("path");
      }
    
    }
    
    export default new StaticMiddleware().run;
    

    最后 app.ts express应用程序本身非常干净:

    import staticMiddleware from "./StaticMiddleware";
    import fooMiddleware from "./FooMiddleware";
    import barMiddleware from "./BarMiddleware";
    
    app.use(staticMiddleware());
    app.use(fooMiddleware());
    app.use(barMiddleware());
    

    但我在运行时遇到了一个错误:

    类型错误:应用程序。use()需要一个中间件函数


    注意,可以更改上面的方法签名,因此我可以使用以下表格:

    app.use(staticMiddleware); 
    

    但对于维护人员来说,这是令人惊讶的,因此很容易损坏。我想要正常的签名:

    app.use(staticMiddleware());
    
    0 回复  |  直到 7 年前
    推荐文章