我有很多
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());