Wyszukiwanie w witrynie

javascript - express.session niezdefiniowane w typescript


Jestem bardzo nowy w TypeScript/JavaScript, próbuję tworzyć backendowe REST API z użyciem session, poniżej znajduje się plik app.ts

import express from "express";
import { applyMiddleware, applyRoutes } from "./utils";
import routes from "./services";

const app = express();

    var ses= {
        secret: "secret_session",
        resave: true,
        saveUninitialized: true,
        cookie: { maxAge: 3600000,secure: false, httpOnly: true
}
if (app.get('env') === 'production') {
    app.set('trust proxy', 1)
    ses.cookie.secure = true
}

app.use(session(ses));

applyRoutes(routes, app);

Uruchomiłem serwer i zastosowałem pośrednie oprogramowanie do obsługi błędów, ale moim zdaniem nie jest to związane z pytaniem, więc nie dodaję kodu z tym związanym. Poniżej znajduje się mój kod routes.ts, w którym próbuję ustawić sesję.

import { Request, Response } from "express";
import { getAll, getByKeyword, addNewProduct } from "./productControllers";
{
path: "/api/v1/getAllProducts",
method: "get",
handler: [
  (req: Request, res: Response) => {
    getAll()
      .then((row: any) => {
       var sess = req.session;
       sess.views = 1;
        res.status(200).json({ data: row });
      })
      .catch(err => {
        res.json({
          message: err
        });
      });
  }
]
}

Otrzymuję błąd przy sess.views=1;

Próbowałem wcześniej sugerowanych pytań, zanim o to zapytałem, żadne z nich nie pomogło mi.

EDYCJA: Stworzyłem index.ts

import searchRoutes from "./products/routes";

export default [...searchRoutes];

Mam inną klasę narzędziową

export const applyRoutes = (routes: Route[], router: Router) => {
  for (const route of routes) {
    const { method, path, handler } = route;
    (router as any)[method](path, handler);
  }
}

Odpowiedź #1

Używasz interfejsu, który jest Request dla express.js. Jednak nie ma on definicji typu dla session. Dlatego TypeScript zgłasza błąd kompilacji. Aby to rozwiązać, musisz zdefiniować typ session w interfejsie Request.

Możesz zdefiniować plik session.d.ts w swoim projekcie. I utworzyć wymagane typy i interfejsy. Na przykład:

declare global {
  namespace Express {
    interface Request {
      session?: Session;
      sessionID?: string;
    }
  }
}

interface Session{
  mySessionVarible:string
}

Ale dobrą rzeczą jest to, że mamy projekt DefinitelyTyped, w którym można znaleźć wiele definicji typów. To powinno rozwiązać twój problem z kompilacją.

npm install --save-dev @types/express-session

I nie zapomnij zmienić swojego importu dla Request.

import { Request, Response } from "@types/express-session";

Powiązane artykuły