结合 Typescript Koa-Router 和 Passport
Posted
技术标签:
【中文标题】结合 Typescript Koa-Router 和 Passport【英文标题】:Combining Typescript Koa-Router and Passport 【发布时间】:2020-05-02 12:31:10 【问题描述】:我是 Typescript 的新手,正在尝试整合 koa-router
和 koa-passport
。全部安装@types\
import Koa from "koa";
import Route from "koa-router";
import passport from "koa-passport";
import session from "koa-session";
const app = new Koa();
const router = new Route();
app.keys = [process.env.SECRET_KEY || "secret"];
app.use(session(, app));
app.use(passport.initialize());
app.use(passport.session());
app.use(router.routes()).use(router.allowedMethods());
当我尝试将passport
方法与router
一起使用时。
router.post("Logout", "/logout", ctx =>
if (ctx.isAuthenticated())
ctx.logout();
);
上下文(ctx)方法有错误
Property 'isAuthenticated' does not exist on type 'ParameterizedContext<any, IRouterParamContext<any, >>'.
Property 'logout' does not exist on type 'ParameterizedContext<any, IRouterParamContext<any, >>'.
我尝试了不同的方法,但都不成功。感谢任何帮助。
【问题讨论】:
你有没有运气解决这个问题?我也有同样的问题。 可能相关:github.com/DefinitelyTyped/DefinitelyTyped/issues/… 【参考方案1】:我发现一种方法是将所有具有单独功能的路线和护照类型定义为typeof KoaPassport
。对于路线as Koa.Middleware
也有这个问题
// src/index.ts
import routes from "./routes";
...
routes(router, model, passport);
// src/routes/index.ts
function routes(router: Route, model: Model, passport: typeof KoaPassport)
router
.post("Login", "/login", (async (ctx, next) =>
await passport.authenticate("local", async (err, user) =>
....
)(ctx, next);
) as Koa.Middleware)
【讨论】:
【参考方案2】:我发现的一种方法是使用
const router = new Route<, koa.Context>();
koa-router 类型在https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/koa-passport/index.d.ts#L23 中将passport 方法添加到koa.Context
。 Router
的第二个类型参数让我们可以向中间件上下文添加额外的属性。通过传入koa.Context
,我们可以访问koa-router添加的功能。
【讨论】:
以上是关于结合 Typescript Koa-Router 和 Passport的主要内容,如果未能解决你的问题,请参考以下文章