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

home2 게시판 Node.js, Express 게시판 (회원기능) 몽고DB 작성자가 null이 뜹니다

(회원기능) 몽고DB 작성자가 null이 뜹니다

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

    김정원
    참가자
    안녕하세요.
    노드 강의 듣는 중 질문이 있어 글 올립니다.
    
    
    // 회원가입
    app.post('/register', function(요청, 응답){
       db.collection('login').insertOne( {id : 요청.body.id, pw : 요청.body.pw}, function(에러, 결과){
          응답.redirect('/')
       }) 
    });
     app.post('/add', function(요청, 응답){
       db.collection('counter').findOne({ name : '게시물갯수'}, function(에러, 결과){
          
          var 총게시물갯수 = 결과.totalPost;
       
          var 저장할거 = { _id : 총게시물갯수 + 1, 작성자 : 요청.user._id, 제목 : 요청.body.title, 날짜 : 요청.body.date }
       db.collection('post').insertOne(저장할거, function(에러, 결과){
       db.collection('counter').updateOne({name : '게시물갯수'}, { $inc : {totalPost:1} }, function(에러, 결과){
          if(에러){return console.log(에러)}
          응답.send('전송완료');
       })
       })
       })
    })
    
    
    위와 같이 코드를 짰는데,
    몽고DB post 콜렉션에는 작성자가 null로 뜹니다.( login 콜렉션에는 가입한 id, pw, _id(자동으로 부여됨)는 잘 기입되어 있습니다)
    login 콜렉션에도 정상적으로 기입되어 있고
    코드도 passport 밑으로 이동시켰는데 무엇이 문제일까요?
    #68804

    codingapple
    키 마스터
    app.post('/add', 로그인했니, 
    미들웨어 추가해봅시다
    #68842

    김정원
    참가자
    말씀하신대로 미들웨어 추가했는데
    여전히 몽고DB에는 작성자가 null로 뜹니다...
    중간 passport 코드 추가로 첨부드립니다 ㅠㅠ
    
    
    // 미들웨어
    function 로그인했니(요청, 응답, next){
       if(요청.user){
          next()   // next() 통과
       } else{
          응답.send('로그인 안 하셨네요')
       }
    }
    
    
    passport.use(new LocalStrategy({
       usernameField: 'id',
       passwordField: 'pw',
       session: true,
       passReqToCallback: false,
     }, function (입력한아이디, 입력한비번, done) {
       //console.log(입력한아이디, 입력한비번);
       db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
         if (에러) return done(에러)
         if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })  // DB에 아이디가 없으면 이거 실행
         if (입력한비번 == 결과.pw) {
           return done(null, 결과)
         } else {
           return done(null, false, { message: '비번틀렸어요' })
         }
       })
     }));
    passport.serializeUser(function (user, done) {
       done(null, user.id)
     });
     
     passport.deserializeUser(function (아이디, done) {  // 위에있는 user.id = 아이디
       db.collection('login').findOne({ id: 아이디 }, function (에러, 결과){
       done(null, {결과})
     })
    });
    
    app.post('/register', function(요청, 응답){
       db.collection('login').insertOne( {id : 요청.body.id, pw : 요청.body.pw}, function(에러, 결과){
          응답.redirect('/')
       }) 
    });
    // 회원가입
    app.post('/register', function(요청, 응답){
       db.collection('login').insertOne( {id : 요청.body.id, pw : 요청.body.pw}, function(에러, 결과){
          응답.redirect('/')
       }) 
    });
    app.post('/add', 로그인했니, function(요청, 응답){
       db.collection('counter').findOne({ name : '게시물갯수'}, function(에러, 결과){
          
          var 총게시물갯수 = 결과.totalPost;
       
          var 저장할거 = { _id : 총게시물갯수 + 1, 작성자 : 요청.user._id, 제목 : 요청.body.title, 날짜 : 요청.body.date }
     db.collection('post').insertOne(저장할거, function(에러, 결과){
       db.collection('counter').updateOne({name : '게시물갯수'}, { $inc : {totalPost:1} }, function(에러, 결과){
          if(에러){return console.log(에러)}
          응답.send('전송완료');
       })
       })
       })
    })
    
    #68865

    codingapple
    키 마스터
     passport.deserializeUser(function (아이디, done) {  // 위에있는 user.id = 아이디
       db.collection('login').findOne({ id: 아이디 }, function (에러, 결과){
       done(null, {결과})
     })
    });
    결과에 {} 빼거나 이상한곳에서 요청.user 잘나오나 출력부터 해봅시다
    #68877

    김정원
    참가자
    이것저것 다시 찾아보니
    뭔가 마이페이지 만드는 부분(회원인증기능3)에 문제가 있는 것 같습니다.
    
    {결과} 에서 중괄호를 빼고 mapage에 접속하면 '로그인 안 하셨네요'가 뜨고,
    {결과} 에서 중괄호를 씌우고 mypage로 이동하면 콘솔창에 { '결과': null } 이라고 뜹니다.
    /mypage에는 '의 마이페이지입니다'라고만 뜹니다.(사용자 id는 출력되지 않아요ㅠㅠ)
    아래 코드는 mypage.ejs <body>부분입니다(제이쿼리 적용 했습니다).
    
    <body>
       <%- include('nav.html') %>
       <p> <%= 사용자.id %>의 마이페이지입니다.</p>
    </body>
    
    
    
    여기저기 구글링도 해보고 뭐도 고쳐보고 해봤는데 노답입니다.
    조금만 더 도와주세요......
    아래는 서버 코드입니다. 상단에는 라이브러리 코드도 예쁘게 있습니다.
    
    
    
    // express 라이브러리 첨부, 사용
    const express = require('express');
    const app = express();
    // bodyparser 라이브러리
    const bodyParser= require('body-parser')
    app.use(bodyParser.urlencoded({extended: true}))
    // 몽고DB  (jwkim409  qwerty123)
    const MongoClient = require('mongodb').MongoClient;
    // method-override 라이브러리
    const methodOverride = require('method-override')
    app.use(methodOverride('_method'))
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    const session = require('express-session');
    app.use(session({secret : '비밀코드', resave : true, saveUninitialized: false}));
    app.use(passport.initialize());
    app.use(passport.session());
    // 환경변수 사용을 위한 라이브러리
    require('dotenv').config()
    // EJS
    app.set('view engine', 'ejs');
    // static 파일을 보관하기 위해 public 폴더
    app.use('/public', express.static('public'));
    
    
    
    
    // 로그인을 하면 아이디 비번 검사
    app.post('/login', passport.authenticate('local', {
       failureRedirect : '/fail' 
    }), function(요청, 응답){
       응답.redirect('/')
    });
    // 미들웨어(마이페이지)
    app.get('/mypage', 로그인했니, function (요청, 응답) {
       console.log(요청.user);
       응답.render('mypage.ejs', { 사용자: 요청.user })
     })
    // 마이페이지 접속 전 실행할 미들웨어
    function 로그인했니(요청, 응답, next){
       if(요청.user){
          next()   // next() 통과
       } else{
          응답.send('로그인 안 하셨네요')
       }
    }
    
    // 로컬스트레티지(복붙)
    passport.use(new LocalStrategy({
       usernameField: 'id',
       passwordField: 'pw',
       session: true,
       passReqToCallback: false,
     }, function (입력한아이디, 입력한비번, done) {
       //console.log(입력한아이디, 입력한비번);
       db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
         if (에러) return done(에러)
         if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })  // DB에 아이디가 없으면 이거 실행
         if (입력한비번 == 결과.pw) {
           return done(null, 결과)
         } else {
           return done(null, false, { message: '비번틀렸어요' })
         }
       })
     }));
    
    // 세션 저장시키는 코드
    passport.serializeUser(function (user, done) {
       done(null, user._id)
     });
     
     passport.deserializeUser(function (아이디, done) {
       db.collection('login').findOne({ id: 아이디 }, function (에러, 결과) {
         done(null, {결과})
       })
     });
    // 회원가입
    app.post('/register', function(요청, 응답){
       db.collection('login').insertOne( {id : 요청.body.id, pw : 요청.body.pw}, function(에러, 결과){
          응답.redirect('/')
       }) 
    });
     app.post('/add', 로그인했니,function(요청, 응답){
       db.collection('counter').findOne({ name : '게시물갯수'}, function(에러, 결과){
          
          var 총게시물갯수 = 결과.totalPost;
       
          var 저장할거 = { _id : 총게시물갯수 + 1, 작성자 : 요청.user._id, 제목 : 요청.body.title, 날짜 : 요청.body.date }
       db.collection('post').insertOne(저장할거, function(에러, 결과){
       db.collection('counter').updateOne({name : '게시물갯수'}, { $inc : {totalPost:1} }, function(에러, 결과){
          if(에러){return console.log(에러)}
          응답.send('전송완료');
       })
       })
       })
    })
    #68920

    codingapple
    키 마스터
    app.get('/mypage 부분도 밑으로 이동시킵시다
    #68931

    김정원
    참가자
    이동해보고 변수 저장할거 출력 함 해봤습니다
    
    
    app.post('/register', function(요청, 응답){
       db.collection('login').insertOne( {id : 요청.body.id, pw : 요청.body.pw}, function(에러, 결과){
          응답.redirect('/')
       }) 
    });
     app.post('/add', 로그인했니,function(요청, 응답){
       db.collection('counter').findOne({ name : '게시물갯수'}, function(에러, 결과){
          
          var 총게시물갯수 = 결과.totalPost;
       
          var 저장할거 = { _id : 총게시물갯수 + 1, 작성자 : 요청.user._id, 제목 : 요청.body.title, 날짜 : 요청.body.date }
       db.collection('post').insertOne(저장할거, function(에러, 결과){
       db.collection('counter').updateOne({name : '게시물갯수'}, { $inc : {totalPost:1} }, function(에러, 결과){
          if(에러){return console.log(에러)}
          console.log(저장할거)
          응답.send('전송완료');
       })
       })
       })
    })
    로그인 하고 리스트에 할 일 적어서 출력해보니
    { _id: 39, '작성자': undefined, '제목': '12112', '날짜': '3232' }
    역시 작성자가 undefined라고 뜨네요;;
    코드 옮겨보고 고쳐보고 이렇게조렇게 해봤습니다
    요청.user._id는 문제 없이 잘 쓴 것 같은데
    왜... 왜 이러는 걸까요..
    #68985

    codingapple
    키 마스터
    요청.user 를 저장하기 전에 출력부터 해봅시다
8 글 보임 - 1 에서 8 까지 (총 8 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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