Javascript 프로젝트를 Typescript로 변환해보자.
참고글 : ts-migrate
변환 과정
.js
파일을 .ts
파일로 변환합니다.
- 타입 정의 추가
JavaScript 코드에서는 동적 타입이였지만, TypeScript는 강력한 정적 타입을 요구합니다.
- 외부 라이브러리 타입 정의
외부 라이브러리를 사용하고 있다면, 해당 라이브러리의 타입 정의 파일을 설치해야 사용할 수 있습니다.
타입 정의 파일이 없을 경우, 직접 작성해야함
1
npm i -D @types/express
app.js
app.js
파일을 app.ts
파일로 변환해보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// app.js
import express, { Request, Response, NextFunction } from "express";
import cors, { CorsOptions } from "cors";
import cookieParser from "cookie-parser";
import path from "path";
import passport from "passports/index.js";
import morganMiddleware from "middleware/morgan.js";
import logger from "config/winston.js";
import "dotenv/config";
// router
import movieRouter from "routes/movie.route.js";
import userRouter from "routes/user.route.js";
import authRouter from "routes/auth.route.js";
const app = express();
const __filename = new URL(import.meta.url).pathname.replace(
/^.*?([A-Za-z]:)/,
"$1"
);
const __dirname = path.dirname(__filename);
app.set("port", process.env.PORT || 5000);
// middleware
const whitelist = ["http://localhost:3000", "http://127.0.0.1:3000"];
const corsOptions = {
origin: (origin, callback) => {
// callback (error : Error | null, allow : boolean)
// allow : true 요청 허용
if (!origin) {
// origin이 없는 경우
callback(null, true); // 허용
} else if (whitelist.includes(origin)) {
// 허용된 출처라면
callback(null, true); // 허용
} else {
// 허용되지 않은 출처라면
callback(new Error(`Not Allowed Origin: ${origin}`)); // 거부
}
},
credentials: true, // 사용자 인증이 필요한 리소스(쿠키 ..등) 접근
};
app.use(cors(corsOptions)); // 옵션을 추가한 CORS 미들웨어 추가
app.use(express.static(`${dirname}/src/public`));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(morganMiddleware);
app.use(passport.initialize());
// router
app.use("/movie", movieRouter);
app.use("/user", userRouter);
app.use("/auth", authRouter);
// error handler
app.use((err, req, res, next) => {
logger.error(err); // 전체 에러 로깅
const statusCode = err.statusCode || 500;
const errorMessage = err.message || "Internal server error";
// 개발 환경에서만 스택 정보를 보냄
if (process.env.NODE_ENV === "dev") {
res.status(statusCode).json({ message: errorMessage, stack: err.stack });
} else {
res.status(statusCode).json({ message: errorMessage });
}
});
export default app;
app.ts
express, cors, cookie-parser의 타입 정의 파일을 설치합니다.
1
npm i -D @types/express @types/cors @types/cookie-parser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// app.ts
import express, { Request, Response, NextFunction } from "express";
import cors, { CorsOptions } from "cors";
import cookieParser from "cookie-parser";
import path from "path";
import passport from "passports/index.js";
import morganMiddleware from "middleware/morgan.js";
import logger from "config/winston.js";
import "dotenv/config";
// router
import movieRouter from "routes/movie.route.js";
import userRouter from "routes/user.route.js";
import authRouter from "routes/auth.route.js";
const app = express();
const __filename = new URL(import.meta.url).pathname.replace(
/^.*?([A-Za-z]:)/,
"$1"
);
const __dirname = path.dirname(__filename);
app.set("port", process.env.PORT || 5000);
// middleware
const whitelist = ["http://localhost:3000", "http://127.0.0.1:3000", undefined];
const corsOptions: CorsOptions = {
origin: (origin, callback) => {
// callback (error : Error | null, allow : boolean)
// allow : true 요청 허용
if (!origin) {
// origin이 없는 경우
callback(null, true); // 허용
} else if (whitelist.includes(origin)) {
// 허용된 출처라면
callback(null, true); // 허용
} else {
// 허용되지 않은 출처라면
callback(new Error(`Not Allowed Origin: ${origin}`)); // 거부
}
},
credentials: true, // 사용자 인증이 필요한 리소스(쿠키 ..등) 접근
};
app.use(cors(corsOptions)); // 옵션을 추가한 CORS 미들웨어 추가
app.use(express.static(path.join(__dirname, "..", "public")));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(morganMiddleware);
app.use(passport.initialize());
// router
app.use("/movie", movieRouter);
app.use("/user", userRouter);
app.use("/auth", authRouter);
// error handler
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
logger.error(err); // 전체 에러 로깅
const statusCode = (err as any).statusCode || 500; // 타입 단언
const errorMessage = err.message || "Internal server error";
// 개발 환경에서만 스택 정보를 보냄
if (process.env.NODE_ENV === "dev") {
res.status(statusCode).json({ message: errorMessage, stack: err.stack });
} else {
res.status(statusCode).json({ message: errorMessage });
}
});
export default app;