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

home2 게시판 Node.js, Express 게시판 mongoose를 활용하는데 막혔어요..

mongoose를 활용하는데 막혔어요..

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

    이지환
    참가자
    db를 mongoose를 활용해서 하는데 user.js에 메소드를 만들었는데 index에서 찾지를 못해요,.
    ------------------
    ./models/User.js
    ------------------
    

    <div>
    <div>const mongoose = require('mongoose');</div>
    <div>const bcrypt =require('bcrypt');</div>
    <div>const saltRounds = 10 ; //10 자리인 salt를 만든다.</div>
    <div>const myPlaintextPassword = 's0/\/\P4$$w0rD' ;</div>
    <div>const someOtherPlaintextPassword = 'not_bacon' ;</div>
    <div>var jwt = require('jsonwebtoken');</div>
    <div>const UserSchema = mongoose.Schema({</div>
    <div>name: {</div>
    <div>type: String,</div>
    <div>maxlength: 50</div>
    <div>},</div>
    <div>email: {</div>
    <div>type: String,</div>
    <div>trim: true,</div>
    <div>unique: 1</div>
    <div>},</div>
    <div>password: {</div>
    <div>type: String,</div>
    <div>minlength: 5</div>
    <div>},</div>
    <div>lastname: {</div>
    <div>type: String,</div>
    <div>maxlength: 50</div>
    <div>},</div>
    <div>role: {</div>
    <div>type: Number,</div>
    <div>default: 0</div>
    <div>},</div>
    <div>image: String,</div>
    <div>token: {</div>
    <div>type: String</div>
    <div>},</div>
    <div>tokenExp:{</div>
    <div>type: Number</div>
    <div>}</div>
    <div>})</div>
    <div>UserSchema.methods.comparePassword = function(plainPassword,cd){</div>
    <div>//입력한 패스워드와 암호화된 패스워드를 비교하기위해 입력한 패스워드도 dcript한다</div>
    <div>bcrypt.compare(plainPassword,this.password,function(err,isMatch){</div>
    <div>if(err) return cb(err),</div>
    <div>cd(null,isMatch)</div>
    <div>})</div>
    <div>
    </div>
    <div>}</div>
    <div>
    </div>
    <div>UserSchema.methods.makeToken = function(cb){</div>
    <div>var user = this;</div>
    <div>var token = jwt.sign(user._id, 'secreatToken');</div>
    <div>// token = user._id+'secretToken'</div>
    <div>// 'secretToken' -> user._id</div>
    <div>
    </div>
    <div>user.token = token</div>
    <div>user.save(function(err,user){</div>
    <div>if(err) return cb(err)</div>
    <div>cb(null,user)</div>
    <div>})</div>
    <div>}</div>
    <div>UserSchema.pre('save',function(next){</div>
    <div>var user = this;</div>
    <div>//비밀번호를 암호화시킨다</div>
    <div>if(user.isModified('password')){</div>
    <div>bcrypt.genSalt(saltRounds,function(err,salt){</div>
    <div>if(err) return next(err)</div>
    <div>
    </div>
    <div>bcrypt.hash(user.password,salt,function(err,hash){</div>
    <div>if(err) return next(err)</div>
    <div>user.password = hash</div>
    <div>next()</div>
    <div>})</div>
    <div>})</div>
    <div>}else {</div>
    <div>next()</div>
    <div>}</div>
    <div>})</div>
    <div>const User = mongoose.model('User', UserSchema);</div>
    <div>module.exports = {User};</div>
    <div>------------------------------</div>
    <div>index.js</div>
    </div>
    <div>------------------------------</div>
    <div>

    const express = require("express")
    const app = express()
    const port = 8080
    //bodyparser 이었지만 express에 내장되어서 이제 가능함
    // app.use(express.urlencoded({extended: true}));
    //bodyparser 인데 app.json 형식으로 할땐 사용하니깐 일단 넣어둠
    const bodyParser = require('body-parser');
    //application/x-xxx-from-unlencoded 형식 파일 가져옴
    app.use(bodyParser.urlencoded({extended: true}));
    //application/json 형식파일 가져옴
    app.use(bodyParser.json());
    //쿠키에 토큰저장 라이브러리
    const cookieParser = require('cookie-parser');
    app.use(cookieParser());
    //user 가져옴 몽고 회원 데이터 정의
    const {User} = require("./models/user");
    const config =require('./config/key');
    const mongoose = require('mongoose');
    mongoose.connect(config.mongoURI)
        .then(()=>console.log('mongodb connected'))
        .catch(err=>console.log(err));
           
        app.get('/', (req, res) => {
            res.send('Hello World!');
        })
        
        app.post('/register', (req, res)=> {
            //회원가입할 때 필요한 정보들을 클라이언트(크롬)에서 가져오면
            //그것들을 데이터 베이스에 넣어준다.
            const user = new User(req.body);
            // 옛날방식이라 에러남 then(성공시)과 catch(실패시)문을 섞어줘야함 
        //     user.save((err,userInfo) =>{
        //         if(err) return res.json({success : false,err})
        //         return res.status(200).json({
        //             success:true
        //         })
        //     })
        // })
            user.save().then(()=>{
                res.status(200).json({success:true})
                console.log('저장완료 register');
            }).catch((err)=>{
                return res.json({success:false,err})
            })
           
        });
        app.post('/login',(req, res) =>{
            
            // 요청된 이메일을 데이터베이스 찾기
            User.findOne({email:req.body.email})
            .then((결과)=>{
                if(!결과){
                    return console.log('이메일이 안맞음');
                }
                else User.comparePassword(req.body.password, (err, isMatch) => {
                    if(!err) return console.log('비밀번호안맞음')
            // Password가 일치하다면 토큰 생과
                    결과.makeToken((err, user)=>{
                        if(err) return console.log('토큰저장실패')
                        // 토큰을 저장
                        else{
                            res.cookie("x_auth", user.token)
                            .status(200)
                            .json({loginSuccess: true, userId: user._id})
                            console.log('로그인성공')
                        }
                    })
                })
            })
            .catch((err)=>{
                return console.log(err);
                    
                
            })
        })
        // app.post('/login',(req, res) =>{
        //     // 요청된 이메일을 데이터베이스 찾기
        //     User.findOne({email: req.body.email})
        //     .then((isMatch)=>{
        //         User.comparePassword(req.body.password),function(err,isMatch){
        //             if(err) return console.log(err).log('findone에러'); 
        //             else if(!isMatch) return console.log("비밀번호가 맞지않음")
        //             else {
        //                 res.cookie("x_auth", user.token)
        //                 .status(200)
        //                 .json({loginSuccess: true, userId: user._id})
        //             }
        //         }
        //      })
        //      .catch((err)=>console.log(err));
        //     })
         
        // app.post('/login',(req,res)=>{
        //     const user = new User(req.body);
        //     //요청된 이메일을 데이터베이스에서 찾는다
        //     user.findOne({email:req.body.email},(err,userInfo)=>{
        //         if(!userInfo){
        //             return res.json({
        //                 loginSuccess : false,
        //                 message : "이메일에 해당하는 유저가 없습니다."
        //             })
        //         } else {
                    
        //             //요청된이메일이 있으면 비밀번호데이터를 찾고 비밀번호가 맞는지 확인
        //             user.comparePassword(req.body.password,(err,isMatch)=>{
        //                 if(!isMatch) return res.json({loginSuccess:false,message:"비밀번호가 틀렸습니다."})
        //                 else{
        //                     //비밀번호가 맞다면 토근을 생성하기
        //                     user.makeToken((err,user)=>{
        //                         if(err) return res.status(400).send(err);
        //                         //토큰을 쿠키나 로컬스토리지에 저장할 수 있는데 그걸 결정한다.
        //                         //일단 쿠키에다가 저장한다.(라이브러리 설치해야)
        //                         res.cookie("x_auth",user.token)
        //                         .status(200)
        //                         .json({loginSuccess:true, userId : user._id})
        //                     })
        //                 }
        //         })    
        //         }
        //     })  
        // })
        //server open console log
        app.listen(port, () => {
          console.log(`B2B app listening on port ${port}`)
        })

    </div>

    #82729

    이지환
    참가자
    TypeError: User.comparePassword is not a function
    #82730

    이지환
    참가자
    이런 오류가 나와요
    
    
    #82814

    codingapple
    키 마스터
    const User = require("./models/user"); 해봅시다
4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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