Wyszukiwanie w witrynie

node.js - Łączenie Typescript Koa-Router i Passport


Jestem nowicjuszem w TypeScript i próbuję zintegrować koa-router oraz koa-passport. Zainstalowałem wszystkie @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());

A kiedy próbuję używać metod passport z router.

router.post("Logout", "/logout", ctx => {
  if (ctx.isAuthenticated()) {
    ctx.logout();
  }
});

występuje błąd w metodach context(ctx)

Property 'isAuthenticated' does not exist on type 'ParameterizedContext<any, IRouterParamContext<any, {}>>'.
Property 'logout' does not exist on type 'ParameterizedContext<any, IRouterParamContext<any, {}>>'.

Próbowałem różnych podejść, ale bezskutecznie. Doceniam każdą pomoc.

Odpowiedź #1

Znalazłem jeden sposób, który polega na zdefiniowaniu wszystkich tras za pomocą oddzielnej funkcji i definicji typu paszportu jako typeof KoaPassport. I dla trasy as Koa.Middleware również występował ten problem

// 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)
}

Odpowiedź #2

Jednym ze sposobów, który znalazłem, było użycie

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

Typy koa-router dodają metody passport do koa.Context w https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/koa-passport/index.d.ts#L23. Drugi parametr typu dla Router pozwala nam dodać dodatkowe właściwości do kontekstu middleware. Przekazując koa.Context, uzyskujemy dostęp do funkcji dodanych przez koa-router.

Powiązane artykuły