Super Kawaii Cute Cat Kaoani
본문 바로가기
🏃‍♀️ 대외활동/UMC 7기 - Node.js

[UMC 7th Server] 6, 7주차 트러블 슈팅 기록

by wonee1 2024. 11. 19.
728x90

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를 테스트 해보세요. 오류 메시지에서 요구하는 모든 필드를 설정
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

728x90