我在使用 Deno 和 Oak 的情况下遇到了以下情况。
大多数教程使用 export const xy = () => {}
语法,将控制器和路由分开。
在路线中,他们通常有类似 router.get("/the-route", xy)
的东西,这很好,但有几个我想避免的警告。
看看这个例子:
const someController = async ({
request,
response,
}: {
request: any;
response: any;
}) => {
// do something
}
1.) 请求和响应是明确的“任何”,我尽量避免这种情况,因为没有类型安全和代码完成可用。 2.) 我想在类语法中使用可扩展的基控制器来执行此操作,其他类是从该基控制器派生的。
所以目前我最终得到了这样的东西(这很毫无意义):
import type { RouterContext } from "https://deno.land/x/oak@v8.0.0/mod.ts";
export class BaseController {
// deno-lint-ignore no-explicit-any
protected ctx: RouterContext<{ id: string }, Record<string, any>>;
// deno-lint-ignore no-explicit-any
constructor(ctx: RouterContext<{ id: string }, Record<string, any>>) {
this.ctx = this.getContext(ctx);
}
// deno-lint-ignore no-explicit-any
getContext = (ctx: RouterContext<{ id: string }, Record<string, any>>) => {
return ctx;
};
}
正如你所看到的,除了接收一些传递给控制器的上下文之外,这几乎没有任何作用,这没有任何意义,因为
router.get("/", (ctx) => { SomeController.createSomething(ctx) })
的操作。BaseController
扩展一个类,它自己有一个构造函数,我什至需要在此处使用 super(ctx : UltraLongType<ThatIDontWantHere>)
长话短说:我真正想做的是让 BaseController.getContext
真正获取当前上下文,而不会将其传递到任何地方。
不幸的是,我找不到一些帮助程序或注入器或任何服务来从“外部”接收当前的 RouterContext。
我真的不明白这个。
也许有人可以帮我解决这个问题:)
提前致谢并致以最诚挚的问候:)