인프런 커뮤니티 질문&답변

andrewlee님의 프로필 이미지

작성한 질문수

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의

노드 리액트 기초 강의 #13 Auth 기능 만들기

도와주세요...

작성

·

659

2

계속 붙잡고 있어도 안되서 헬프를 칩니다.. 뭐가 문제인거죠..? 

auth.js 파일에서 findbytoken을 만드는데 계속 안되기만 합니다.

TypeError: User.findByTokenis not a function
   at auth (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\middleware\auth.js:8:10)
   at Layer.handle [as handle_request] (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\layer.js:95:5)
   at next (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\route.js:137:13)
   at Route.dispatch (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\route.js:112:3)
   at Layer.handle [as handle_request] (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\layer.js:95:5)
   at C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\index.js:281:22
   at Function.process_params (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\index.js:335:12)
   at next (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\index.js:275:10)
   at cookieParser (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\cookie-parser\index.js:71:5)
   at Layer.handle [as handle_request] (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\layer.js:95:5)
   at trim_prefix (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\index.js:317:13)
   at C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\index.js:284:7
   at Function.process_params (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\index.js:335:12)
   at next (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\express\lib\router\index.js:275:10)
   at C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\body-parser\lib\read.js:130:5
   at invokeCallback (C:\Users\AndrewLee\Desktop\node_basic\boilerPlate\node_modules\raw-body\index.js:224:16)

ㄱ계속 이 문구만 뜨고요 함수가 아니라는데 저는 함수를
user.js에 만들었고.. 아 이게 무슨 문제일까요..

auth.js

const { User } = require('../models/user');
let auth = (reqresnext=> {
    // 이곳에서 인증처리를 하는 곳 
    // 클라이언트 쿠리에서 토큰을 가져온다 ==> 쿠키 파서를 이용한다. 
    let token = req.cookies.x_auth;
    console.log('auth/token :' + token);
    // 토큰을 복호화한 후 유저를 찾는다.
    User.findByToken(token, (erruser=> {
        if (errthrow err;
        if (!user) {
            return res.json({ isAuth: falseerror: true })// 유저가 없으니까 
        }
        else { // 유저가 있으면 
            req.token = token// 이렇게 설정해주는 이유는 콜러에서 req.token , req.user와 같이 사용할 수 있게 하기 위해서이다. 
            req.user = user;
            next();
        }
    });
    // 유저가 있으면 인증 오케이 
    // 유저가 없으면 인증 노노 
}

module.exports = {auth};


user.js


const mongoose = require('../node_modules/mongoose');

const bcrypt = require('bcrypt');
const saltRounds = 10;
const myPlaintextPassword = 's0/\/\P4$$w0rD';
const someOtherPlaintextPassword = 'not_bacon';
var jwt = require('jsonwebtoken');

const userSchema = mongoose.Schema({
    name :{
        type:String,
        maxlength:50
    },
    email:{
        type:String,
        trim:true//스페이스를 없앤다 
        unique : 1 // 유일한 특성 
    }, 
    password :{
        type:String,
        minlength:5
    },
    lastname:{
        type:String,
        maxlength:50
    },
    role:// 롤을 주는 이유는 유저의 관리권한을 부여하기 위해서 
        type: Number,
        defalut: 0 
    },
    image:String ,
    token:// 토큰을 이용해서 유효성등을 나중에 관리함 
        type: String
    },
    tokenExp :// 토큰의 유효기간 
        type:Number 
    }
})

userSchema.pre('save'function (next) {
    var user = this;
    console.log('1');
    if (user.isModified('password')) {
        console.log('2');
        bcrypt.genSalt(saltRoundsfunction (errsalt) { 
            console.log('3');
            if (errreturn next(err); 
            console.log('4');
            bcrypt.hash(user.passwordsaltfunction (errhash) {
                console.log('5');
                if (errreturn next(err);
                console.log('6');
                console.log(hash);
                user.password = hash;
                next(); 
            });
        });
    }else{
        next();
    }
}) 

userSchema.methods.comparePassword = function(planPassword,cb){ 
    bcrypt.compare(planPassword,this.password,function(err,isMatch){
        if(errreturn cb(err);
        cb(null,isMatch); 
    } );
}

userSchema.methods.generateToken =function(cb){
    var user = this
    // json웹토큰을 이용해서 토큰을 생성하기 
    var token = jwt.sign(user._id.toHexString(), 'hihello');
    // 이렇게 토큰을 만들면 ,, 
    // user._id + hihello = token이 되고, 나중에는 token과 hihello로 user._id를 만들 수 있다. 
    user.token = token ;
    user.save(function(err,user){
        if(errreturn cb(err); // 에러가 났으면 에러를 전달 
        cb(null,user); // 문제가 없으면 에러는 없고 유저를 전달 자 그럼 index.js로 넘어가서~
    });
}
userSchema.methods.Bfunction(token,cb){}

userSchema.methods.findByTokenfunction(token,cb){
    var user = this
    // 토큰을 디코드 한다. user_id + '' = token 
    console.log("1 : " + token );
    jwt.verify(token'hihello',function(err,decoded){
        // 유저 아이디를 이용해서 유저를 찾은 다음에 
        // 클라이언트에서 가져온 token과 db에 보관된 토큰이 일치하는지 확인 
        user.findOne({"_id":decoded,"token":token},function(err,user){
            if(err){
                return cb(err);
            }else{
                cb(nulluser);
            }
        })
    })
}


const User = mongoose.model('User',userSchema);
console.log(User.comparePassword);
module.exports = {User};

좋은 강의 항상 감사드립니다.

답변 7

2

andrewlee님의 프로필 이미지
andrewlee
질문자

userSchema.methods.findByTokenfunction(token,cb){

가 아니라 

userSchema.Static.findByTokenfunction(token,cb){

이엇나 그랫을거에요

2

John Ahn님의 프로필 이미지
John Ahn
지식공유자

ㅠㅠ  .... 질문 주시면 제가  항상 밤에 답해드릴게요 !!!    너무 막힐땐  꼭 질문주세요 도와드릴게요 !!!! 

1

해결했으무리다.

0

andrewlee님의 프로필 이미지
andrewlee
질문자

statics s가 소문자네요 늦어서 죄송해용~

0

userSchema.statics.findByToken = function (token, cb) 이렇게 작성했는데 동일한 에러가 뜹니다 ㅠ

0

ㅈㅓ도 같은 문제인데... 어떻게 해결하셨나요??

0

andrewlee님의 프로필 이미지
andrewlee
질문자

찾았습니다... 감사합니다

어떤게 문제였나요? 저도 같은 findByToken not a function에러가 뜨네요

type error같은데 못찾곘어요