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

home2 게시판 Node.js, Express 게시판 .ajax is not a function (slim 제거해도 문제 발생)

.ajax is not a function (slim 제거해도 문제 발생)

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

    김형철
    참가자

    오류메세지 Uncaught TypeError: $.ajax is not a function 뜹니다.

    구글링해보니 slim 버전사용해서 그렇다고 합니다.

    slim 빼고 / 서버,  vscode,  컴퓨터 껐다 켜봐도 똑같습니다.

    다른 강의 들을때도 ajax가 이상하게 잘 안먹어서 고생했는데 (결국못함)

    요즘 제이쿼리 안쓰는 추세라고 하니 이번에도 안되면 제이쿼리 평생 쓸일 없을것 같습니당.

    하단에 코드 첨부했는데 보시고 답변해 주시면 감사하겠습니다.

     

     

     

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

     

    const express = require("express");
    const app = express();

    // mongoDB Atlas 서비스 연결하기
    // 이것도 npm 설치해야 함 -> npm install mongodb
    const MongoClient = require("mongodb").MongoClient;

    //데이터를 html에 쉽게 보여주는 ejs 설치 및 import -> npm install ejs
    app.set("view engine", "ejs");

    //데이터를 담을 변수를 선언
    var db;

    //mongoDB 연결해라라는 함수 : url 값은 site에서 복사했고 id, password 잘 입력하자
    MongoClient.connect(
      "mongodb+srv://pp11:@cluster0.tjmpn.mongodb.net/todoapp?retryWrites=true&w=majority",
      (error, client) => {
        //오류가 났을 때 아래의 코드를 실행해라. 조건이 1개이기 떄문에 간단하게 1줄로 작성
        if (error) return console.log(error);
        //mongoDB에 생성한 database가 'todoapp'임
        db = client.db("todoapp");
        var inputData = {};
        app.post("/add", (req, res) => {
          res.send("complete");
          //postCounter라는 이름을 가진 db를 찾으시오
          db.collection("counter").findOne({ name: "postCounter" }, (err, rst) => {
            console.log(rst.totalPost);
            var postCounter = rst.totalPost;
            inputData = {
              _id: postCounter,
              title: req.body.title,
              date: req.body.date,
            };
            db.collection("post").insertOne(inputData, (err, res) => {
              console.log("저장완료");
              db.collection("counter").updateOne(
                { name: "postCounter" },
                { $inc: { totalPost: 1 } },
                (err, rst) => {
                  if (err) {
                    return console.log(err);
                  }
                }
              );
            });
          });
        });

        //데이터를 저장할 때는 object 자료형으로 저장할 것

        // db.collection("post").insertOne(inputData, (err, res) => {
        //   console.log("저장완료");
        // });

        //오류 안났으면 8080포트로 연결하고 console.log 띄워라
        app.listen("8080", function () {
          console.log("listening on 8080");
        });
      }
    );

    app.use(express.urlencoded({ extended: true }));

    // GET요청 하는 법
    // app.get(포트or주소, function(요청req,응답res){
    //     응답.send('펫용품 쇼핑할 수 있는 페이지입니다.')
    // });

    app.get("/pet", function (req, res) {
      res.send("펫용품 쇼핑할 수 있는 페이지입니다.");
    });

    // homework-1

    app.get("beauty", function (req, res) {
      res.send("뷰티용품 쇼핑할 수 있는 페이지입니다.");
    });

    //html 불러오는 방법
    //sendFile()은 파일을 보낼 수 있는 함수
    //__dirname은 현재파일의 경로를 뜻함

    app.get("/", function (req, res) {
      res.sendFile(__dirname + "/index.html");
    });

    // homework-2

    app.get("/write", function (req, res) {
      res.sendFile(__dirname + "/write.html");
    });

    //누군가 /add 경로로 POST 요청을 하면 ~를 해주세요.
    //homework-3

    // app.post("/add", (req, res) => {
    //   console.log(req.body);
    //   res.send("complete");
    // });

    // ejs 문서를 보내주는 법
    app.get("/list", (req, res) => {
      //database에 저장된 post라는 collection 안의 어떤 데이터를 꺼내주세요.
      db.collection("post")
        .find()
        .toArray((err, rst) => {
          console.log(rst);
          res.render("list.ejs", { cardList: rst });
        });
    });

    // app.delete("/delete", (req, res) => {
    //   console.log(req.body);
    //   req.body._id = parseInt(req.body._id);
    //   db.collection("post").deleteOne(req.body, (error, rst) => {
    //     if (error) return console.log(error);
    //   });
    //   res.send("삭제완료");
    // });

    app.delete("/delete", function (요청, 응답) {
      요청.body._id = parseInt(요청.body._id);
      db.collection("post").deleteOne(요청.body, function (에러, 결과) {
        console.log("삭제완료");
      });
      응답.send("삭제완료");
    });

     

    list.ejs ---------------------------------------------------------------------------------------------------------------

     

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <!-- Required meta tags -->
        <meta charset="utf-8" />
        <meta
          name="viewport"
          content="width=device-width, initial-scale=1, shrink-to-fit=no"
        />

        <!-- Bootstrap CSS -->
        <link
          rel="stylesheet"
          href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
        />

        <title>Hello, world!</title>
      </head>
      <body>
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
          <a class="navbar-brand" href="#">Navbar</a>
          <button
            class="navbar-toggler"
            type="button"
            data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>

          <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav mr-auto">
              <li class="nav-item active">
                <a class="nav-link" href="/"
                  >Home <span class="sr-only">(current)</span></a
                >
              </li>
              <li class="nav-item">
                <a class="nav-link" href="/write">Write</a>
              </li>
              <li class="nav-item">
                <a class="nav-link" href="#" tabindex="-1" aria-disabled="true"
                  >Disabled</a
                >
              </li>
            </ul>
          </div>
        </nav>
        <!-- ejs 파일은 항상 views 라는 파일을 만들어서 보관해야지 오류가 뜨지 않는다 -->
        <!-- ejs에서 서버 데이터를 가져올 경우 아래 코딩을 통해 값을 불러옴 -->
        <div class="container">
          <div class="low">
            <h2 style="display: flex; justify-content: center; margin: 20px">
              To do list
            </h2>
            <% for(var i = 0; i < cardList.length; i++){ %>
            <div class="card border-dark" style="margin: 1vh">
              <div
                class="card-body"
                style="
                  display: flex;
                  justify-content: space-between;
                  align-items: center;
                "
              >
                <p>글번호: <%= cardList[i]._id %></p>
                <h4 class="card-title" style="margin: 0">
                  <%= cardList[i].title %>
                </h4>
                <p style="margin: 0"><%= cardList[i].date %></p>
                <button class="delete" data-id="<%= cardList[i]._id %>">
                  삭제
                </button>
              </div>
            </div>
            <% }; %>
          </div>
        </div>

        <script
          src="https://code.jquery.com/jquery-3.6.0.js"
          type="text/javascript"
        ></script>

        <script>
          //삭제 버튼이 클릭 되었을 때 삭제 버튼에 숨겨 두었던 해당 id 값을 가진 data id 값을 서버에 보내줌
          // $(".del").click((e) => {
          //   console.log(e);
          //   $.ajax({
          //     method: "DELETE",
          //     url: "/delete",
          //     data: { _id: e.target.dataset.id },
          //   }).done(function (error, rst) {
          //     if (error) return console.log(error);
          //   });
          // });
          $(".delete").click(function (e) {
            $.ajax({
              method: "DELETE",
              url: "/delete",
              data: { _id: e.target.dataset.id },
            }).done(function (결과) {
              //AJAX 성공시 실행할 코드는 여기
            });
          });
        </script>

        <!-- Optional JavaScript; choose one of the two! -->

        <!-- Option 1: jQuery and Bootstrap Bundle (includes Popper) -->
        <script
          src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
          integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
          crossorigin="anonymous"
        ></script>
        <script
          src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"
          integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns"
          crossorigin="anonymous"
        ></script>

        <!-- Option 2: Separate Popper and Bootstrap JS -->
        <!--

        <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.min.js" integrity="sha384-+YQ4JLhjyBLPDQt//I+STsc9iw4uQqACwlvpslubQzn4u2UU2UFM80nGisd026JF" crossorigin="anonymous"></script>
        -->
      </body>
    </html>

     

     

    오류메세지 ------------------------------------------------------------------------------------------------------

     

     

     

    #13876

    김형철
    참가자

    그냥 ajax만 썼을 때 지워지는데

    class.click 안에 넣으면 작동을 안해요

    #13880

    codingapple
    키 마스터

    밑에 script태그에 jquery-3.5.1.slim.min.js 이 파일을 지우도록 합시다

    #13881

    김형철
    참가자

    세상에나...

    주말 잘 보내세요

    #55674

    조호준
    참가자
    저도 이 문제때문에 한참 구글링했는데... 역시 답은 여기있었구나...
    #87153

    박도영
    참가자
    저게 ajax요청 못쓰게함 ㅡㅡ
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 호 / 개인정보관리자 : 박종흠