Cors 이슈
이슈를 해결하고 브라우저에서 서버단으로 정보를 보내는 방법
이슈를 확인하기 위해 클라이언트에서 서버로 데이터 전송해보기
클라이언트에서 서버로 데이터를 전송할때 axios(악시오스) 라이브러리를 사용
npm install axios --save
명령어로 클라이언트(리액트) 에서 다운로드
클라이언트 에서 axios 를 사용하여 서버에 POST 로 데이터 전송
useEffect(() => {
axios
.post('http://IP:port/AndPoint')
.then((res) => {
alert("요청성공")
console.log(res)
})
.catch((err) => {
alert("요청실패")
console.log(err)
})
})
와 같은 형식으로 데이터 받아오기
4-1.axios.post()
에서 post() 안에 들어오는 건 어떤 URL로 get요청을 보낼지 post 요청을 보낼지 적는것
4-2. 현 코드에서는 post 요청을 보내고 있음
Test로 백server 에서 /api/test
로 post로 데이터를 보냄
클라이언트 단에서 post요청을 작성했지만 서버단에서 post로 보내오는 요청을 구현하지 않았으므로 서버단에도 요청사항에 대해서 구현을 해준다.
6-1.
// request = 요청 => 클라이언트에서 서버로 보내는 요청
// response = 응답 => 서버에서 클라이언트로 보내는 응답
app.post("/api/test", (request, response) => {
console.log(request);
response.status(200).josn({ success: true})
})
서로 다른 포트로 요청을 보내기 위해서는 Proxying 설정을 해주어야 한다.
Proxy 설정을 하기 위해서는 Proxying API Requests in Development 에서 예제 코드를 볼 수 있다.
// Proxy 설정을 하는 예제 방법
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
createProxyMiddleware({
// api 요청같은 경우에는 port번호를 5000으로 보내겠다는걸 알려주는 코드
target: 'http://localhost:5000',
changeOrigin: true,
})
);
};
해당 예제 코드를 클라이언트 src
폴더에 setupProcy.js
파일을 생성하여 작성한다.
라이브러리 사용을 위해서 클라이언트에 npm install http-proxy-middleware --save
로 라이브러리를 설치해 준다.
클라이언트에서 다시한번 요청을 시도해보게되면 요청이 성공하는걸 알수 있다.
const [list, setList] = useState("")
useEffect(() => {
axios
.post("/api/test")
.then((response) => {
// 성공 핸들링 / get이 성공했을때
setList(response.data.test)
})
.catch((error) => {
// 에러 핸들링 / get이 실패했을때
alert("요청실패")
console.log(error)
})
}, [])
useEffect(() => {
let body = {
text: '안녕하세요 클라이언트입니다'
}
axios
.post("/api/test")
.then((response) => {
// 성공 핸들링 / get이 성공했을때
setList(response.data.test)
})
.catch((error) => {
// 에러 핸들링 / get이 실패했을때
alert("요청실패")
console.log(error)
})
}, [])
14-2. 이후 post메소드의 두번째요소에 보낼 데이터를 작성해준다.
useEffect(() => {
let body = {
text: '안녕하세요 클라이언트입니다'
}
axios
.post("/api/test", body)
.then((response) => {
// 성공 핸들링 / get이 성공했을때
setList(response.data.test)
})
.catch((error) => {
// 에러 핸들링 / get이 실패했을때
alert("요청실패")
console.log(error)
})
}, [])
14-3. 클라이언트에서 보내는 데이터를 확인하기 위해서 서버측 코드를 수정해준다.
app.post('/api/test', (request, response) => {
console.log(request.body)
response.status(200).json({ success: true, test: '안녕하세요' })
})
14-4. 위와 같이 request(요청)으로 받는 데이터를 확인하기 위해서 request.body
로 들어온 정보를 출력해 확인할 수 있다.
클라이언트에서 body라는 변수이름으로 보냈기때문에 body로 확인
14-5. 이후 서버측 터미널에서 출력된 부분을 확인해보면 undefined임을 확인할 수 있다.
이는 서버단에서 클라이언트에서 보내는 body에 대해서 읽을수 없기 때문에 일어나는 에러로 이를 해결하기 위해서 파싱이라는걸 해주어야 한다.
파싱을 하기위해 body.parsor
라는 것을 사용해 주어야한다.
body.parsor
는 Express가 버전4 로 상승하면서 내장되어 따로 설치는 안해주어도 된다(아래 버전은 따로 설치를해서 사용해 주어야 한다.)
14-6. undefined를 해결하기위해서 파싱을 하기위해 서버측에서 body.parsor
를 사용해야하는데 이를 위해서
app.use(express.json())
app.use(express.urlencoded({ extended: true }));
코드를 작성해주어야 한다.