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

home2 게시판 Node.js, Express 게시판 회원 게시판에서 유저의 아이디가 DB에 저장되지 않습니다.

회원 게시판에서 유저의 아이디가 DB에 저장되지 않습니다.

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

    유광현
    참가자
    
    게시글에 작성자를 추가하는 강의에서 코드를 따라했는데 몽고 DB에서는 작성자 : null로 뜨고, 
    콘솔에서 유저 전체 데이터는 보이는데 키 데이터만 출력하라고 하면 undefined가 나타납니다.
    
    #59584

    유광현
    참가자
        var 저장할거 = {
          _id: 총게시물갯수 + 1,
          작성자: req.user,
          제목: req.body.title,
          날짜: req.body.date,
        };
    로 작성자에 user를 통째로 줬더니 DB에 object로는 저장이 되네요.. 왜 내부 키만 인식을 못하는지 모르겠습니다.
    
    #59611

    유광현
    참가자
    user1이라고 전역변수를 만들어서 passport.deserializeUser의 결과값을 넣고 user1._id로 하니까 잘 되네요.
    그런데 app.post("/add") 안에서 req.user를 읽을 수 있으면 req.user._id도 읽을 수 있어야 하는거 아닌가?? 하는 생각이 드네요
    
    #59630

    codingapple
    키 마스터
    app.post("/add", 로그인했니, function(){}도 추가해봅시다
    #59682

    유광현
    참가자
    말씀대로 파라미터도 추가해봤는데 req.user._id는 안 읽힙니다. ㅠㅠ
    
    일단 만든 변수로 계속 사용해보겠습니다.
    #59684

    유광현
    참가자
    server.js 전체 코드 올려봅니다. req.user._id를 사용한 코드입니다.
    
    const express = require("express");
    const app = express();
    const session = require("express-session");
    const passport = require("passport");
    const LocalStrategy = require("passport-local").Strategy;
    const methodOverride = require("method-override");
    const bodyParser = require("body-parser");
    app.use(
      session({
        secret: "anything",
        resave: true,
        saveUninitialized: false,
      })
    );
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(methodOverride("_method"));
    app.set("view engine", "ejs");
    app.use("/public", express.static("public"));
    var db;
    MongoClient = require("mongodb").MongoClient;
    MongoClient.connect(
      "mongodb+srv://KHYu:4BEnquJMs9fzECi@cluster0.weudp7o.mongodb.net/todoapp?retryWrites=true&w=majority",
      (err, client) => {
        if (err) {
          return console.log(error);
        }
        db = client.db("todoapp");
        app.listen(3000, () => {
          console.log("나의 서버 Connected!");
        });
      }
    );
    app.get("/pet", (req, res) => {
      res.send("펫용품을 쇼핑할 수 있는 페이지입니다.");
    });
    app.get("/beauty", (req, res) => {
      res.send("뷰티용품 페이지입니다.");
    });
    app.get("/", (req, res) => {
      res.render("index.ejs");
    });
    app.get("/write", (req, res) => {
      res.render("write.ejs");
    });
    app.get("/list", (req, res) => {
      db.collection("post")
        .find()
        .toArray((err, result) => {
          res.render("list.ejs", { mylist: result });
        });
    });
    app.delete("/delete", (req, res) => {
      //ajax에서 delete 호출을 받아서 delete를 수행하는 api
      req.body._id = parseInt(req.body._id); // 로그인한 사용자의 id가 아니라 게시글의 id임.
      var 삭제할데이터 = { _id: req.body._id, 작성자: user1.id };
      // deleteOne() 함수에게 첫 번째 인자로 전달할 삭제 조건임
      // req.body_id는 게시물의 아이디이고(list.ejs의 삭제버튼에서 ajax로 넘어옴 ),
      // user1.id는 작성자의 id이다. 햇갈리지 말 것.
      db.collection("post").deleteOne(삭제할데이터, (err, result) => {
        // ajax가 data로 보낸 값을 받아서(req.body에 포함된 값 = {_id : 1})
        //그것과 일치하는 값을 가진 post 콜렉션의 object(게시글)를 하나 삭제한다.
        console.log("삭제완료");
        res.status(200).send({ message: "요청 성공" });
      });
    });
    app.get("/detail/:id", (req, res) => {
      // 웹브라우저 주소창에 입력할 뒷 번호를 id로 인식하도록 주소단 선언
      db.collection("post").findOne(
        { _id: parseInt(req.params.id) }, // request.params.id는 string이므로 int로 바꿔줘야 한다.
        (err, result) => {
          if (result === null) {
            res.send("잘못된 요청입니다.");
          }
          // 주소에 입력한 id를 함수에 전달
          res.render("detail.ejs", { forDetail: result }); // findOne이 반환한 result(조건에 맞는 DB의 객체)를 변수에 저장
        }
      );
    });
    app.get("/edit/:id", (req, res) => {
      //주소표시줄에서 /edit/번호 입력시 번호는 id로 인식하도록 함
      db.collection("post").findOne(
        { _id: parseInt(req.params.id) }, // 주소표시줄에서 받은 id번호를 정수로 변환하고 findOne()에게 전달
        (err, result) => {
          // 해당하는 id값을 가진 객체 반환
          res.render("edit.ejs", { forEdit: result }); // 반환된 객체를 forEdit라는 변수에 저장하고 edit.ejs에게 전달
        }
      );
    });
    app.put("/edit", (req, res) => {
      // 폼 입력창의 수정하기 버튼을 누르면 호출되는 api
      db.collection("post").updateOne(
        { _id: parseInt(req.body.id) }, //폼 태그의 입력 데이터는 text로 전달되므로 정수로 변환 필요 (<input type ="text"....>)
        { $set: { 제목: req.body.title, 날짜: req.body.date } },
        (err, result) => {
          console.log("수정완료!");
          res.redirect("/list");
          // updateOne({object 형식으로 객체를 찾을 조건},{$set: {obejct 형식으로 변경할 데이터}}, 콜백함수)
        }
      );
    });
    app.get("/login", (req, res) => {
      res.render("login.ejs");
    });
    app.post(
      "/login",
      passport.authenticate("local", { failureRedirect: "/fail" }),
      //passport라이브러리의 인증 함수를 호출, local 방식으로 인증하고 실패시 /fail로 리다이렉트
      (req, res) => {
        res.redirect("/");
      }
    );
    app.get("/mypage", 로그인확인, (req, res) => {
      // 사용자 생성 미들웨어를 요청과 응답을 처리하는 함수 이전에 실행시킴.
      res.render("mypage.ejs", { forMypage: req.user });
    });
    function 로그인확인(req, res, next) {
      // 사용자 생성 미들웨어
      if (req.user) {
        next();
      } else {
        res.send("로그인안하셨는데요?");
      }
    }
    passport.use(
      new LocalStrategy(
        {
          // passport.authenticate()에 의해 호출되는 전략
          usernameField: "id", // form 태그 내부의 input에 지정한 name으로 지정(아이디 입력 태그)
          passwordField: "psw", // form 태그 내부의 input에 지정한 name으로 지정(비밀번호 입력 태그)
          session: true, // 로그인 후 세션을 저장(true일시)
          passReqToCallback: false, // 다른 정보도 검증할 건지 유무
        },
        function (입력한아이디, 입력한비번, done) {
          db.collection("login").findOne(
            { id: 입력한아이디 },
            function (에러, 결과) {
              if (에러) return done(에러);
              if (!결과)
                return done(null, false, { message: "존재하지않는 아이디요" });
              // 아이디를 찾지 못할 경우 에러메시지 출력, done() 함수는 첫 번째 인자는 오류를 나타내는 null,
              // 두 번째 인자는 반환될 객체를 저장할 변수를 선언하지만 객체가 반환되지 않는다면 반드시 false를 선언한다.
              // 세 번째는 출력할 오류메시지이다.
              if (입력한비번 == 결과.pw) {
                // 아이디가 맞다면 findOne()이 찾아낸 객체의 비밀번호와 폼에서 입력한 비번을 비교
                return done(null, 결과); // 비밀번호 둘이 일치하면 결과에 객체 반환
              } else {
                return done(null, false, { message: "비번틀렸어요" }); // 비번이 틀리면 오류메세지 반환
              }
            }
          );
        }
      )
    );
    passport.serializeUser((user, done) => {
      // 세션을 만드는 함수(로그인 성공 시 호출)
      done(null, user.id); //user.id로 세션과 쿠키를 생성(암호화되어 있음)
    });
    
    passport.deserializeUser((아이디, done) => {
      // 파라미터 아이디는 serializeUser가 반환한 user.id가 들어간다
      db.collection("login").findOne({ id: 아이디 }, (err, result) => {
        done(null, { result });
      });
      // 보안이 필요한 페이지 접속 시 해당 세션 정보와 일치하는 사용자를 DB에서 찾는 함수
      // serializeUser가 반환한 id값만 가지고 사용자의 전체 정보를 가져온다.
    });
    app.post("/register", (req, res) => {
      db.collection("login").insertOne(
        { id: req.body.id, pw: req.body.psw },
        (err, result) => {
          res.redirect("/");
        }
      );
    });
    app.post("/add", 로그인확인,
    (req, res) => {
      res.send("전송완료");
      db.collection("counter").findOne({ name: "게시물갯수" }, (err, result) => {
        // DB의 counter라는 콜렉션에서 name 속성이 게시물갯수인 객체 하나를 찾아주세요
        var 총게시물갯수 = result.totalPost;
        var 저장할거 = {
          _id: 총게시물갯수 + 1,
          작성자: req.user._id,
          제목: req.body.title,
          날짜: req.body.date,
        };
        db.collection("post").insertOne(저장할거, (err, result) => {
          if (err) {
            console.log(err);
          }
          console.log("DB 저장완료");
          db.collection("counter").updateOne(
            // 전달된 collection의 속성을 갱신하는 함수
            { name: "게시물갯수" }, // 첫 번째 파라미터 : name이 게시물갯수인 객체를 찾아서...
            { $inc: { totalPost: 1 } }, // 두 번째 파라미터 : 그 객체의 totalPost키의 값을 1씩 증가($inc) 시킨다.
            (err, result) => {
              if (err) {
                console.log(err);
              }
            }
          );
        });
      });
    });
    app.get("/search", (req, res) => {
      var 검색조건 = [
        // search 인덱스를 쓰기 위한 선언문
        {
          $search: {
            index: "titleSearch", // 몽고 아틀라스에서 생성한 search 인덱스의 이름
            text: {
              query: req.query.value, // 쿼리스트링을 질의어로 전달
              path: "제목", // 제목 속성의 값을 탐색, 여러 속성을 찾으려면 ["제목", "날짜"] 식으로..
            },
          },
        },
        { $project: { 제목: 1, _id: 0, score: { $meta: "searchScore" } } },
        // 제목은 보여주고(1), id는 보여주지 않는다(0) (필터링 기능)
        //  score: { $meta: "searchScore" } 는 index에 존재하지 않는 searchScore라는 속성을 만들어서 score로 전달함
        // searchScore는 검색 빈도 순으로 정렬해줌
      ];
      db.collection("post") // 접속한 DB의 post collection에서...
        .aggregate(검색조건) // search 인덱스는 find 대신 aggregate를 사용
        .toArray((err, result) => {
          // 그에 맞는 객체들을 반환해라. 무언가 잘못되면 error 반환.
          res.render("search.ejs", { forSearch: result });
        });
    });
    
    
    		
    	
    #59698

    codingapple
    키 마스터
    res.send("전송완료")는 updateOne콜백함수 안으로 옮깁시다 모든작업이 완료시 실행하는게 좋습니다
7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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