구현한 파일 업로드 API는 아래와 같다. 파일 1개와 강아지 id를 입력 받는 간단한 파일 업로드 API이다.
@Mutation(() => [String])
@UseGuards(GqlAuthGuard('access'))
uploadDogImage(
@Args({
name: 'file',
type: () => GraphQLUpload,
})
image: FileUpload, //
@Args('dogId')
dogId: string,
): Promise<void | string[]> {
return this.filesService.uploadImage({ image: [image], dogId });
}
구현에는 어려움이 없었는데 포스트맨으로 테스트하는 과정에서 에러가 발생했다.
operations
에 dogId
를 추가하였다.{
"query": "mutation uploadDogImage($file: Upload! $dogId: String!) { uploadDogImage(file: $file dogId: $dogId) }",
"variables": { "file": null, "dogId": null }
}
map
에 dogId
를 추가하였다.{ "0": ["variables.file"], "dogId": ["variables.dogId"] }
dogId
키 추가 후 강아지id를 할당하였다."Variable \"$dogId\" got invalid value { resolve: [function], reject: [function], promise: {} }; String cannot represent a non string value: { resolve: [function], reject: [function], promise: {} }"
구글링 결과 아래와 같은 문제가 있었다.
operations
에 작성한 GraphQL 쿼리문이 잘못되었다.map
은 파일에만 사용해야 한다.operations
에 작성한 GraphQL 쿼리문을 아래와 같이 수정한다.{
"query": "mutation uploadDogImage($file: Upload! $dogId: String!) { uploadDogImage(file: $file dogId: $dogId) }",
"variables": { "file": null, "dogId": "a518c5ad-8227-4ad0-9c8c-183f0b3fb7fe" }
}
variables
의 dogId
에 직접 값을 입력했다는 점이 달라졌다.map
은 파일에만 사용하도록 수정한다.{ "0": ["variables.file"] }
dogId
키를 제거한다.위 방식으로 파일 업로드 API에 파일과 함께 다른 아규먼트를 전달할 수 있었다.