눈이 좋거나, 운이 좋으면 바로 찾고 이도 저도 아니면 한참을 헤메는 에러인거 같다.
결론은 클라이언트가 보내는 데이터형식이 라우터에 지정한 형식과 일치하지 않을 때 발생하는 에러이다.
즉, 문자형로 보냈는데 int형으로 받는다든지 할 때 발생한다. 이런 경우라면 쉽게 발견되기도 하는데 422에러가 처음이라면 헤매기 쉽다.
왜냐면 컨트롤러 안으로 들어오지도 않고, 파라미터를 리플렉션(보내는 변수와 받는쪽의 변수를 일치 시키는 작업이라고 생각하자) 하면서 내부적으로 발생하기 때문이다.
아래예를 보자면 params 이 보내는 변수이고, AnswerUpdate 클래스는 받는부분을 정의한 것인데 FastAPI가 내부적으로 이를 일치시키는데 형식이 틀려서 발생한 것이다.
아래예에서 잘못된 점은 content가 element인데 여기까지 해놓고 잠깐 다른일 보고와서 param을 정의하면서 변수를 content라는 생각만으로 content = content 라고 생각없이 작업해서 발생한 것이다. content = content.value 즉 문자열을 넣었어야 했는데 HTML 엘리먼트를 전송한 것이다. 이러니 보내는쪽은 엘리먼트이고, 받는쪽에서는 문자열로 정의해 놓아서 발생한 문제였다.
클라이언트가 보내는 예
let content = document.querySelector('#div-reply-' + answer_id +' > div > textarea' )
let url = '/api/answer/update'
let params = {
answer_id: answer_id,
content: content,
}
fastapi('put', url, params,
(json) => {
console.log('Success')
},
(json_error)=>{
console.log('Error')
}
)
}
서버쪽에서 받는 예
@router.put('/update', status_code=HTTP_204_NO_CONTENT)
def answer_update(_answer_update: answer_schema.AnswerUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)):
print('여기까지 타고 들어오지 않는다.')
....
...
AnswerUpdate Class
class AnswerUpdate(BaseModel):
answer_id: int
content: str