4

我是 Typescript 的新手,正在尝试集成koa-routerkoa-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, {}>>'.

我尝试了不同的方法,但没有成功。感谢任何帮助。

4

2 回答 2

0

我发现一种方法是将所有具有单独功能和护照类型定义的路由定义为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)
}
于 2020-05-02T10:43:46.830 回答
0

我发现的一种方法是使用

const router = new Route<{}, koa.Context>();

koa-router 类型将护照方法添加到koa.Contexthttps://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/koa-passport/index.d.ts#L23。第二个类型参数Router让我们向中间件上下文添加额外的属性。通过传入koa.Context,我们可以访问 koa-router 添加的功能。

于 2021-08-11T06:25:09.750 回答