У меня в экспресс-приложении много app.use(...)
, и они становятся грязными и сложными, и везде есть настройки.Поэтому я хочу переместить их в отдельные модули, чтобы их было проще тестировать.
Итак, у меня есть базовый класс 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());
Но я получаю ошибку во время выполнения:
TypeError: app.use () требуется функция промежуточного программного обеспечения
Обратите внимание, что можно изменить сигнатуры метода выше, поэтому я могу использовать эту форму:
app.use(staticMiddleware);
Но это удивительно для сопровождающего и так может сломаться.Я хочу нормальную подпись:
app.use(staticMiddleware());