6~7주차를 진행하면서 났던 오류들을 기록해봅니다.
https://studycodinging.tistory.com/105
[UMC 7th Server] Chapter 6. ORM 사용해보기
Chapter 6. ORM 사용해보기 ☑️ 실습 인증 🔨ORM 사용해보기 실습더보기 다음 명령어로 prisma 라이브러리를 설치했습니다.npm install @prisma/client prisma 👉 Prisma 설정 파일 만들기 다음과
studycodinging.tistory.com
https://studycodinging.tistory.com/110
[UMC 7th Server] Chapter 7. Express 미들웨어 & API 응답 통일 & 에러 핸들링
Chapter 7. Express 미들웨어 & API 응답 통일 & 에러 핸들링 ☑️ 실습 인증 express 미들웨어 더보기import express from 'express';const app = express();const port = 3000;const myLogger = (req, res, next) => { con
studycodinging.tistory.com
⚡6주차 트러블 슈팅 기록
NO.1
이슈
👉 Argument storeId: Invalid value provided. Expected IntFilter or Int, provided String 오류 발생
Argument storeId: Invalid value provided. Expected IntFilter or Int, provided String.
at Dn (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:114:8082)
at Mn.handleRequestError (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:7396)
at Mn.handleAndLogRequestError (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:7061)
at Mn.request (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:6745)
at async l (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:130:9633)
at async getAllStoreReviews (file:///D:/umc-week5/src/repositories/user.repository.js:54:19)
at async listStoreReviews (file:///D:/umc-week5/src/services/store.service.js:21:19)
at async handleListStoreReviews (file:///D:/umc-week5/src/controller/store.controller.js:17:19) {
clientVersion: '5.21.1'
}
문제
👉
- Prisma에서 storeId가 Int 형식으로 지정되어 있는데, 문자열로 제공했기 때문에 발생
- storeId는 Int 타입이므로 Prisma가 문자열 "1"을 받아들이지 못하고 오류를 발생시켰던 것
해결
👉 storeId를 정수로 변환:
storeId가 문자열이 아니라 정수로 전달되도록 컨트롤러나 서비스 레이어에서 변환
export const handleListStoreReviews = async (req, res, next) => {
try {
const storeId = parseInt(req.params.storeId, 10); // storeId를 정수로 변환
const cursor = req.query.cursor ? parseInt(req.query.cursor, 10) : 0; // cursor 기본값 설정
const reviews = await listStoreReviews(storeId, cursor);
res.status(StatusCodes.OK).json(reviews);
} catch (error) {
console.error(error);
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: '리뷰 조회에 실패했습니다.' });
}
};
참고 레퍼런스
- 오류 로그를 보고 storeId 형식을 수정해야겠다고 생각했습니다.
NO.2
이슈
👉 user와 store를 null로 리턴하는 현상
TTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 26
ETag: W/"1a-cu5+mc44qDfmQ9TfrCaIxJwtVWU"
Date: Sun, 27 Oct 2024 11:43:09 GMT
Connection: close
{
"user": null,
"store": null
}
문제
👉
- responseFromReviews 함수가 제대로 호출되지 않고, 단일 리뷰 객체에 대한 DTOresponseFromReview가 직접 호출됨.
- listStoreReviews에서 잘못된 데이터가 반환되었기 때문에 발생한 현상
해결
👉 listStoreReviews 함수에서 responseFromReviews가 아닌, responseFromReview가 잘못 호출된 것이 아닌지 확인했습니다.
→ 확인 결과 잘못 호출하였다는 걸 알게 되었고, 바로 수정하였습니다.
참고 레퍼런스
- 위와 같습니다.
NO.3
이슈
👉
PrismaClientValidationError:
Invalid prisma.missions.findMany() invocation:
{
select: {
id: true,
description: true,
mission_status: true,
created_at: true,
region: {
select: {
id: true,
region_name: true
}
}
},
where: {
storeId: 1,
~~~~~~~
? AND?: missionsWhereInput | missionsWhereInput[],
? OR?: missionsWhereInput[],
? NOT?: missionsWhereInput | missionsWhereInput[],
? id?: IntFilter | Int,
? regionId?: IntFilter | Int,
? mission_status?: EnumMissionStatusFilter | MissionStatus,
? description?: StringFilter | String,
? created_at?: DateTimeFilter | DateTime,
? region?: RegionsRelationFilter | regionsWhereInput,
? user_missions?: User_missionsListRelationFilter
},
orderBy: {
id: "asc"
},
take: 5
}
Unknown argument storeId. Available options are marked with ?.
at Dn (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:114:8082)
at Mn.handleRequestError (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:7396)
at Mn.handleAndLogRequestError (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:7061)
at Mn.request (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:6745)
at async l (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:130:9633)
at async getStoreMissions (file:///D:/umc-week5/src/repositories/mission.repository.js:17:20)
at async listStoreMissions (file:///D:/umc-week5/src/services/mission.service.js:15:22)
at async handleListStoreMissions (file:///D:/umc-week5/src/controller/mission.controller.js:19:22) {
clientVersion: '5.21.1'
}
PrismaClientValidationError:
Invalid prisma.missions.findMany() invocation:
{
select: {
id: true,
description: true,
mission_status: true,
created_at: true,
region: {
select: {
id: true,
region_name: true
}
}
},
where: {
storeId: 1,
~~~~~~~
? AND?: missionsWhereInput | missionsWhereInput[],
? OR?: missionsWhereInput[],
? NOT?: missionsWhereInput | missionsWhereInput[],
? id?: IntFilter | Int,
? regionId?: IntFilter | Int,
? mission_status?: EnumMissionStatusFilter | MissionStatus,
? description?: StringFilter | String,
? created_at?: DateTimeFilter | DateTime,
? region?: RegionsRelationFilter | regionsWhereInput,
? user_missions?: User_missionsListRelationFilter
},
orderBy: {
id: "asc"
},
take: 5
}
Unknown argument storeId. Available options are marked with ?.
at Dn (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:114:8082)
at Mn.handleRequestError (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:7396)
at Mn.handleAndLogRequestError (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:7061)
at Mn.request (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:121:6745)
at async l (D:\\umc-week5\\node_modules\\@prisma\\client\\runtime\\library.js:130:9633)
at async getStoreMissions (file:///D:/umc-week5/src/repositories/mission.repository.js:17:20)
at async listStoreMissions (file:///D:/umc-week5/src/services/mission.service.js:15:22)
at async handleListStoreMissions (file:///D:/umc-week5/src/controller/mission.controller.js:19:22) {
clientVersion: '5.21.1'
}
문제
👉missions 모델에 storeId 필드가 존재하지 않기 때문에 발생!
해결
👉
스키마에서 missions가 regions나 stores와 연결된 방식에 따라 적절히 수정하였습니다. 또한 MYSQL도 같이 수정해주었습니다,
MYSQL 수정
-- `missions` 테이블에 `storeId` 컬럼 추가
ALTER TABLE missions
ADD COLUMN store_id INT;
-- `missions.store_id`를 `stores.id`와 연결하는 외래 키 제약 조건 추가
ALTER TABLE missions
ADD CONSTRAINT fk_store_missions
FOREIGN KEY (store_id) REFERENCES stores(id)
ON DELETE SET NULL; -- 스토어 삭제 시 NULL로 설정 (필요에 따라 설정 가능)
Prisma 수정
// stores 모델
model stores {
id Int @id @default(autoincrement())
store_name String @db.VarChar(100)
region regions? @relation(fields: [regionId], references: [id])
regionId Int? @map("region_id")
store_address String? @db.VarChar(255)
reviews reviews[]
user_missions user_missions[]
missions missions[] // stores와 missions 간의 관계 설정
@@map("stores")
}
// missions 모델
model missions {
id Int @id @default(autoincrement())
description String @db.Text
mission_status MissionStatus
created_at DateTime @default(now()) @db.Timestamp(6)
region regions? @relation(fields: [regionId], references: [id])
regionId Int? @map("region_id")
store stores? @relation(fields: [storeId], references: [id]) // stores와 관계 설정
storeId Int? @map("store_id") // stores의 외래 키
user_missions user_missions[]
@@map("missions")
}
참고 레퍼런스
NO.4
이슈
👉 깃 이슈 발생
$ git checkout feature/mission-06
error: Your local changes to the following files would be overwritten by checkout:
package-lock.json
package.json
src/controller/challenge.controller.js
src/controller/mission.controller.js
src/controller/review.controller.js
src/controller/store.controller.js
src/controller/user.controller.js
src/db.config.js
src/dtos/challenge.dto.js
src/dtos/mission.dto.js
src/dtos/review.dto.js
src/dtos/store.dto.js
src/dtos/user.dto.js
src/index.js
src/repositories/challenge.repository.js
src/repositories/mission.repository.js
src/repositories/review.repository.js
src/repositories/store.repository.js
src/repositories/user.repository.js
src/services/challenge.service.js
src/services/mission.service.js
src/services/review.service.js
src/services/store.service.js
src/services/user.service.js
test.http
Please commit your changes or stash them before you switch branches.
Aborting
문제
👉
feature/mission-06 브랜치로 체크아웃이 성공했으나 git log를 보면 여전히 first commit만 있는 상태
또, 추가된 파일들(prisma/migrations/...)이 있으며, 이전 브랜치에서의 모든 파일들이 현재 커밋에 포함되지 않은 상태
해결
👉 git log를 활용하여 커밋로그를 본 다음 수정
ommit ac2dc78b90046b77a1e9cf71ffd2c1c34766c7bf (HEAD -> feature/mission-06, origin/main, origin/feature/mission-06)
Author: gimchaewon <gimchaewon417@gmail.com>
Date: Mon Oct 14 12:03:20 2024 +0900
first commit
# 먼저 feature/mission-05 브랜치로 돌아가서 확인
git checkout feature/mission-05
# feature/mission-06 브랜치로 돌아가기
git checkout feature/mission-06
# feature/mission-05의 변경 사항을 feature/mission-06으로 병합
git merge feature/mission-05
참고 레퍼런스
NO.5
이슈
👉 ReferenceError: router is not defined 오류 발생
file:///D:/umc-week5/src/index.js:33
router.get('/api/users/:userId/reviews', handleListUserReviews);
^
ReferenceError: router is not defined
at file:///D:/umc-week5/src/index.js:33:1
at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
at async ModuleLoader.import (node:internal/modules/esm/loader:316:24)
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:123:5)
문제
👉 이 오류는 router 변수가 선언되지 않았기 때문에 발생!
해결
👉router를 사용하지 않고 그냥 app로 일단 구현했습니다. 추후에 router를 사용하는 방식으로 바꿀 예정입니다.
// src/index.js
import express from "express";
import cors from "cors";
import { handleStoreSignUp,handleListStoreReviews} from "./controller/store.controller.js";
import { handleReviewSignUp } from "./controller/review.controller.js";
import { handleMissionSignUp,handleListStoreMissions,handleListUserInProgressMissions,handleCompleteUserMission } from "./controller/mission.controller.js";
import { handleChallengeSignUp } from "./controller/challenge.controller.js";
import { handleListUserReviews } from './controller/user.controller.js';
const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.json());
app.use(cors());
// 가게 추가 API
app.post("/api/stores", handleStoreSignUp);
// 가게 리뷰 추가 API
app.post("/api/reviews", handleReviewSignUp);
// 가게 미션 추가 API
app.post("/api/missions", handleMissionSignUp);
// 가게의 미션 도전하기 API
app.post("/api/challenges", handleChallengeSignUp);
// 리뷰 목록 확인
app.get("/api/stores/:storeId/reviews", handleListStoreReviews)
// 내가 작성한 리뷰 목록 확인
app.get('/api/users/:userId/reviews', handleListUserReviews);
// 특정 가게의 미션 목록 조회 API
app.get('/api/stores/:storeId/missions', handleListStoreMissions);
// 특정 사용자의 진행 중인 미션 목록 조회 API
app.get('/api/users/:userId/missions/in-progress', handleListUserInProgressMissions);
// 특정 사용자의 진행 중인 미션 완료로 업데이트 API
app.put('/api/users/:userId/missions/:missionId/complete', handleCompleteUserMission);
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
⚡7주차 트러블 슈팅 기록
NO.1
이슈
👉
file:///D:/umc-week5/src/controller/store.controller.js:5
export const storeSignUp = async (data) => {
^
SyntaxError: Identifier 'storeSignUp' has already been declared
at ModuleLoader.moduleStrategy (node:internal/modules/esm/translators:169:18)
at callTranslator (node:internal/modules/esm/loader:272:14)
at ModuleLoader.moduleProvider (node:internal/modules/esm/loader:278:30)
Node.js v20.15.0
[nodemon] app crashed - waiting for file changes before starting.
문제
👉 오류 메시지에서 Identifier 'storeSignUp' has already been declared 라는 것은 storeSignUp이라는 식별자가 두 번 정의되었다는 의미
해결
👉
- 중복된 선언 제거하기:
- storeSignUp이 두 번 선언되지 않았는지 확인하고, 중복된 선언을 제거해야 합니다.
- 보통 이런 오류는 동일한 파일에서 여러 번 선언을 시도하거나, 다른 파일에서 이미 선언된 것을 다시 가져와서 사용하는 경우 발생합니다.
- 중복된 코드 확인:
- 선언이 중복되지 않도록 코드 내에서 storeSignUp이 어디서 선언되었는지 확인하고 중복된 부분을 제거합니다.
NO.2
이슈
👉 가게 추가 중 오류 발생
HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 761
ETag: W/"2f9-pvruj8XHt2dV5xo1FBPjh4zHE2Q"
Date: Mon, 04 Nov 2024 13:09:18 GMT
Connection: close
{
"resultType": "FAIL",
"error": {
"errorCode": "unknown",
"reason": "가게 추가 중 오류 발생: \\nInvalid prisma.stores.create() invocation:\\n\\n{\\n data: {\\n store_name: \\"Awesome Cafe\\",\\n store_address: \\"123 Coffee Street\\",\\n region: {\\n connect: {\\n id: undefined,\\n? region_name?: String,\\n? AND?: regionsWhereInput | regionsWhereInput[],\\n? OR?: regionsWhereInput[],\\n? NOT?: regionsWhereInput | regionsWhereInput[],\\n? stores?: StoresListRelationFilter,\\n? missions?: MissionsListRelationFilter\\n }\\n }\\n }\\n}\\n\\nArgument connect of type regionsWhereUniqueInput needs at least one of id or region_name arguments. Available options are marked with ?.",
"data": null
},
"success": null
}'
문제
👉
오류 메시지를 보면 prisma.stores.create() 호출 중 region.connect.id가 undefined로 전달되고 있는 것을 알 수 있습니다. 이로 인해 connect 연산자에 적합한 id가 없어서 오류가 발생
해결
👉
서비스 코드에서 regionId가 제대로 전달되는지 확인했고 컨트롤러에서도 수정했습니다.
NO.3
이슈
👉 가게 추가 중 오류 발생
HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 761
ETag: W/"2f9-pvruj8XHt2dV5xo1FBPjh4zHE2Q"
Date: Mon, 04 Nov 2024 13:09:18 GMT
Connection: close
{
"resultType": "FAIL",
"error": {
"errorCode": "unknown",
"reason": "가게 추가 중 오류 발생: \\nInvalid prisma.stores.create() invocation:\\n\\n{\\n data: {\\n store_name: \\"Awesome Cafe\\",\\n store_address: \\"123 Coffee Street\\",\\n region: {\\n connect: {\\n id: undefined,\\n? region_name?: String,\\n? AND?: regionsWhereInput | regionsWhereInput[],\\n? OR?: regionsWhereInput[],\\n? NOT?: regionsWhereInput | regionsWhereInput[],\\n? stores?: StoresListRelationFilter,\\n? missions?: MissionsListRelationFilter\\n }\\n }\\n }\\n}\\n\\nArgument connect of type regionsWhereUniqueInput needs at least one of id or region_name arguments. Available options are marked with ?.",
"data": null
},
"success": null
}'
문제
👉
오류 메시지를 보면 prisma.stores.create() 호출 중 region.connect.id가 undefined로 전달되고 있는 것을 알 수 있습니다. 이로 인해 connect 연산자에 적합한 id가 없어서 오류가 발생
해결
👉
서비스 코드에서 regionId가 제대로 전달되는지 확인했고 컨트롤러에서도 수정했습니다.
NO.4
이슈
👉 가게 추가 중 오류 발생
HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 781
ETag: W/"30d-ghMMH9QG0GCeRblzz+oDEsL5LXY"
Date: Mon, 04 Nov 2024 13:27:07 GMT
Connection: close
{
"resultType": "FAIL",
"error": {
"errorCode": "C001",
"reason": "미션 도전에 실패했습니다.",
"data": {
"userId": 1,
"missionId": 1,
"storeId": 1,
"status": "IN_PROGRESS",
"reason": "\\nInvalid prisma.user_missions.create() invocation:\\n\\n{\\n data: {\\n user: {\\n connect: {\\n id: 1\\n }\\n },\\n mission: {\\n connect: {\\n id: 1\\n }\\n },\\n store: {\\n connect: {\\n id: 1\\n }\\n },\\n status: \\"IN_PROGRESS\\",\\n+ point: {\\n+ create: user_pointsCreateWithoutUser_missionsInput | user_pointsUncheckedCreateWithoutUser_missionsInput,\\n+ connectOrCreate: user_pointsCreateOrConnectWithoutUser_missionsInput,\\n+ connect: user_pointsWhereUniqueInput\\n+ }\\n }\\n}\\n\\nArgument point is missing."
}
},
"success": null
}
문제
👉
오류 메시지에 따르면 prisma.user_missions.create() 함수에서 point 필드가 필요하지만 누락되어 있다고 한다. user_missions 모델이 user_points와 연결되어 있어, user_points 데이터가 생성되거나 연결되어야 한다.
이를 해결하려면 addChallenge 함수에서 point 필드를 추가하여 user_missions와 user_points의 관계를 적절하게 설정해야 한다.
해결
👉
addChallenge 함수에서 point 필드를 추가해 user_missions 생성 시점을 변경 이렇게 수정한 후 다시 API를 테스트 해보세요. 오류 메시지에서 요구하는 모든 필드를 설정
'🏃♀️ 대외활동 > UMC 7기 - Node.js' 카테고리의 다른 글
[UMC] 7th Ne(o)rdinary 해커톤 회고록 (0) | 2024.11.27 |
---|---|
[UMC 7th Server] 9주차 트러블 슈팅 (0) | 2024.11.25 |
[UMC 7th Server] Chapter 8. 프론트엔드 연동과 Swagger (2) | 2024.11.18 |
[UMC 7th Server] Chapter 7. Express 미들웨어 & API 응답 통일 & 에러 핸들링 (3) | 2024.11.12 |
[UMC 7th Server] Chapter 6. ORM 사용해보기 (4) | 2024.11.07 |