# graphql 파일 업로드 API 구현시 문제점
###### tags: `trouble shooting`
### file에서 읽어온 createReadStream 문제
```
const { createReadStream, filename } = await file;
const stream = createReadStream();
```
- 파일에서 읽어온 createReadStream을 생성하는 순간 Maximum call stack size exceeded 오류 발생

### 시도 방법 1
- graphql-upload를 사용하여 graphqlUploadExpress를 미들웨어로 추가하는 방법
- 그러나 postman으로 요청을 보냈을 때, `Missing multipart field operations` 라는 메시지 반환
- postMan을 통해 요청을 보낼때 operactions 필드를 함께 보냈지만 계속 Missing field라는 응답을 보냈다.

- github에서 curl로 요청하는 코드를 그대로 보내보아도 똑같은 에러 응답을 받았다
```
curl localhost:3000/graphql \
-F operations='{ "query": "mutation ($file: Upload!) { uploadImage(file: $file) { id } }", "variables": { "file": null } }' \
-F map='{ "0": ["variables.file"] }' \
-F 0=@a.txt
```
- 해결 실패...
### 시도방법 2
- Node의 버전을 12버전으로 다운그레이드 하는 방법
- 검색해 본 결과 노드 상위 버전에서는 동작하지 않는다는 글 발견
[링크](https://github.com/jaydenseric/graphql-upload/issues/170)
- nvm을 통해 node의 버전을 관리하기로 했다.
[nvm으로 node버전 관리 방법](https://gist.github.com/falsy/8aa42ae311a9adb50e2ca7d8702c9af1)
- node 버전을 12버전으로 낮추고 난 다음에 정상적으로 작동
### 여러개의 이미지를 업로드 하기 위해
[graphql 공식문서](https://www.apollographql.com/docs/apollo-server/data/file-uploads/)
- 하나의 파일을 업로드 하는 방법이 나온다.
- Upload 대신 배열을 입력받아, map로 각 요소마다 하나의파일을 업로드 하는 방법을 사용해서 해결하였다.
### 추후 논의 사항
- 받아온 파일을 aws s3 같은 외부 서버에 저장을 할지, 아니면 현재 프로젝트에 저장을 할지는 이야기 해보아야 할 것 같다.
- 현재는 현재 프로젝트 내에 파일을 저장하는 방식을 사용하였다.