I am trying to implement session-based authentication system with using Express.js + TypeScript.
I got the problem below in my console while I cannot see any errors in my code.
TSError: ⨯ Unable to compile TypeScript:
src/controllers/users/authController.ts:21:17 - error TS2339: Property 'loggedIn' does not exist on type 'Session & Partial<SessionData>'.
21 req.session.loggedIn = true;
~~~~~~~~
src/controllers/users/authController.ts:22:17 - error TS2339: Property 'user' does not exist on type 'Session & Partial<SessionData>'.
22 req.session.user = user;
~~~~
at createTSError (/Users/apensia/dev/letha-api/node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/ts-node/src/index.ts:587:12)
at reportTSError (/Users/apensia/dev/letha-api/node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/ts-node/src/index.ts:591:19)
at getOutput (/Users/apensia/dev/letha-api/node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/ts-node/src/index.ts:921:36)
at Object.compile (/Users/apensia/dev/letha-api/node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/ts-node/src/index.ts:1189:32)
at Module.m._compile (/Users/apensia/dev/letha-api/node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/ts-node/src/index.ts:1295:42)
at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
at Object.require.extensions.<computed> [as .ts] (/Users/apensia/dev/letha-api/node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/ts-node/src/index.ts:1298:12)
at Module.load (node:internal/modules/cjs/loader:1207:32)
at Function.Module._load (node:internal/modules/cjs/loader:1023:12)
at Module.require (node:internal/modules/cjs/loader:1235:19)
What I am trying to do
I am trying to make authentication system with session-based with using express-session
and connect-mongo
package.
Dependencies
# package.json
"devDependencies": {
# omitted...
"@types/connect-mongo": "^3.1.3",
"@types/express": "^4.17.21",
"@types/express-session": "^1.18.0",
"mongoose": "^8.5.1",
"nodemon": "^3.1.4",
"ts-node": "10.0.0",
"typescript": "^5.5.3"
},
"dependencies": {
"connect-mongo": "^5.1.0",
"express": "^4.19.2",
"express-session": "^1.18.0",
"mongodb": "^6.8.0",
}
Relevant Codes
// This file is for module merging of express-session package so that I can personally include data that I want to put in my session data.
// src/@types/libs/express-session/index.d.ts
import "express-session";
declare module "express-session" {
export interface SessionData {
user: { [key: string]: any };
loggedIn: boolean;
}
}
// This is my main Express.js server init file
import "dotenv/config";
import connectDB from "./db";
import express, { Application } from "express";
import morgan from "morgan";
import helmet from "helmet";
import session from "express-session";
import MongoStore from "connect-mongo";
import { specs, swaggerUi } from "./swagger.config";
import { userRouter, reviewRouter, authRouter } from "./routers";
const app: Application = express();
const PORT = process.env.NODE_ENV === "development" ? process.env.PORT : 4001;
// DB Connection
connectDB();
// Misc
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Session
const SESSION_SECRET_KEY = process.env.SESSION_SECRET_KEY as string;
app.use(
session({
resave: false,
secret: SESSION_SECRET_KEY,
saveUninitialized: false,
cookie: { secure: true, maxAge: 60 * 5 },
store: MongoStore.create({}),
})
);
I feel like TypeError is coming mainly from ts-node
but don’t know where to start to fix.