• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Node.js, Express 게시판 외부 API 호출 CORS 문제

외부 API 호출 CORS 문제

6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 글쓴이
  • #34208

    조윤상
    참가자

    선생님

    유가정보 API를 ejs에서 호출하는데 cors 문제가 있어서 

    server.js 에  아래 부분을 추가했는데도 같은 에러가 발생합니다.

    ------------------------------------------

    const cors = require('cors');

    const corsOptions = {
      origin: "http://localhost:8080",
      credentials: true
    }

    app.use(cors(corsOptions));

    -----------------------------------------

     

     

    ---------------------------------------------------------------

    server.js 전체

    const express = require('express');
    const cors = require('cors');
    const app = express();
    const bodyParser= require('body-parser');
    const corsOptions = {
      origin: "http://localhost:8080",
      credentials: true
    }
    app.use(cors(corsOptions));
    app.use(express.json());
    app.use(express.urlencoded({extended: true}));
    app.use(bodyParser.urlencoded({extended: true}));
    app.set(' engine', 'ejs');

    app.listen(8080, function(){
        console.log('listening on 8080');
    });

    app.get('/', function(req, res){
        res.send();
        res.render(__dirname + '/views/index.ejs');
    });

    app.get('/main', function(req, res){
        res.render(__dirname + '/views/main.ejs');
    });

    ---------------------------------------------------------------

     

    main.ejs (api 호출 하는 부분)

    ..........................................생략

          <h4>OPINET 유가</h4>

          <div>
            <table class="table">
              <thead>
                <tr>
                  <th></th>
                  <th></th>
                  <th></th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td></td>
                  <td></td>
                  <td></td>
                </tr>
                <tr>
                  <td></td>
                  <td></td>
                  <td></td>
                </tr>
                <tr>
                  <td></td>
                  <td></td>
                  <td></td>
                </tr>
              </tbody>
             </table>
          </div>

        <div class="col-2"></div>
      </div>
     
    </body>
    </html>

    <script>

    $().ready(function(){

      //유가정보 가져오기
      $("#addStopOver").click(function(){
       
        fetch("http://www.opinet.co.kr/api/avgAllPrice.do?out=xml&code=F220512145")
        .then(function(response){
          console.log("111");
          return response.json();
        })
        .then(function(myJson){
          console.log("222");
          console.log(JSON.stringify(myJson));
        })
        .catch(function(){
          console.log("실패");
        });  

      })

    });

    </script>

     

    에러 화면

    #34226

    codingapple
    키 마스터

    const cors = require('cors');

    app.use(cors());

    이것만 추가해봅시다 

    #34241

    조윤상
    참가자

    여전히 안되서 크롬 확장 프로그램으로 임시적으로 막았어요,,

    ejs파일에서 api 호출을 저렇게  해도 되나요??

     

    server.js  ----------------------------------------------

    const express = require('express');
    const cors = require('cors');
    const app = express();
    const bodyParser= require('body-parser');
    app.use(cors());
    app.use(express.json());
    app.use(express.urlencoded({extended: true}));
    app.use(bodyParser.urlencoded({extended: true}));
    app.set(' engine', 'ejs');

    app.listen(8080, function(){
        console.log('listening on 8080');
    });

    app.get('/', function(req, res){
        res.render(__dirname + '/views/index.ejs');
    });

    app.get('/main', function(req, res){
        res.header("Access-Control-Allow-Origin", "*");
        res.render(__dirname + '/views/main.ejs');
    });

     

    ----------------------------------------------------------------------

    main.ejs -----------------------------------------------------------

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
      <script  src="http://code.jquery.com/jquery-latest.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
      <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
      <style>
        .form-control{
            width : 50%;
            display : inline;
        }
      </style>
      <title>Document</title>
    </head>
    <body>

      <h4 class="container mt-4"><strong>title</strong></h4>

      <div class="container">
        <div class="col-2"></div>
          <div class="container mt-3">
            <form>
              <div class="form-group">
                <label>출발지</label>
                <input type="text" class="form-control">
              </div>
              <div id="stopOverAppendSpot" class="form-group">
                <label>목적지</label>
                <input type="text" class="form-control">
              </div>
              <button type="button" id="addStopOver" class="btn btn-outline-secondary">경유지 추가</button>
              <button type="button" id="excel" class="btn btn-outline-secondary">Excel</button>
            </form>
            <br><br><br>
          </div>

          <h4 id="opinetInfo-title">오늘의 유가</h4>
         
          <div>
            <table class="table">
              <thead>
                <tr>
                  <th>유종</th>
                  <th>가격</th>
                  <th>차이</th>
                </tr>
              </thead>
              <tbody class="opinetInfo-today">
              </tbody>
             </table>
          </div>

        <div class="col-2"></div>
      </div>

    </body>
    </html>

    <script>

    let oilInfo;
    let stopOverCnt = 0;

    $().ready(function(){

      //유가정보 가져오기
      var promise = new Promise(function(){
        fetch("http://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=F220512145", { dataType:'json',header : {'Content-Type': 'application/json', 'Accept': 'application/json'}})
          .then(function(response){
            return response.json();
          })
          .then(function(json){
            oilInfo = json.RESULT.OIL;
           
            var renderStr="";
            document.getElementById("opinetInfo-title").innerHTML += '(' + oilInfo[0].TRADE_DT + ')';
           
            for(var i = 0; i< 5; i++){
              if(oilInfo[i].PRODNM == "실내등유") continue;

              renderStr += `<tr>
                              <td>${oilInfo[i].PRODNM}</td>
                              <td>${oilInfo[i].PRICE}</td>
                              <td>${oilInfo[i].DIFF}</td>
                            </tr>`
            }
           
            $(".opinetInfo-today").append(renderStr);

          })
          .catch(function(){
            console.log("error");
          });  
      })

      $("#addStopOver").click(function(){
        stopOverCnt++;
        var appendStr = "";
       
        appendStr += ` <div class="form-group">
                        <label>경유지${stopOverCnt}</label>
                        <input type="text" id="stopOver${stopOverCnt}"class="form-control" style="width:50%; display:inline">
                        <button type="button" id="remove()" class="btn btn-danger">삭제</button>
                      </div>`;

        $("#stopOverAppendSpot").before(appendStr);

        function remove(){
          console.log(this)
        }
      });

     
    });

    </script>

     

    ---------------------------------------------------------------------------

     

    #34253

    codingapple
    키 마스터

    보니까 opinet이라는 곳으로 get요청이 막힌거네요

    그건 opinet 서버개발자가 cors를 해제하거나 그래야합니다 get요청하는코드는 별문제없어보이는데요 

    #34279

    조윤상
    참가자

    그러면 프론트에서 스크립트로 호출하는 방법 말고 

    server.js 에서 직접 호출하는 것도 방법이 될 수 있을까요?

    #34299

    codingapple
    키 마스터

    네 거기서 한번 해봅시다 

    서버에 axios 깔아서 axios.get 해도 됩니다 

6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠