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";
