-
카테고리
-
세부 분야
풀스택
-
해결 여부
미해결
도와주세요...
20.04.06 11:04 작성 조회수 444
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 = (req, res, next) => {
// 이곳에서 인증처리를 하는 곳
// 클라이언트 쿠리에서 토큰을 가져온다 ==> 쿠키 파서를 이용한다.
let token = req.cookies.x_auth;
console.log('auth/token :' + token);
// 토큰을 복호화한 후 유저를 찾는다.
User.findByToken(token, (err, user) => {
if (err) throw err;
if (!user) {
return res.json({ isAuth: false, error: 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(saltRounds, function (err, salt) {
console.log('3');
if (err) return next(err);
console.log('4');
bcrypt.hash(user.password, salt, function (err, hash) {
console.log('5');
if (err) return 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(err) return 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(err) return cb(err); // 에러가 났으면 에러를 전달
cb(null,user); // 문제가 없으면 에러는 없고 유저를 전달 자 그럼 index.js로 넘어가서~
});
}
userSchema.methods.B= function(token,cb){}
userSchema.methods.findByToken= function(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(null, user);
}
})
})
}
const User = mongoose.model('User',userSchema);
console.log(User.comparePassword);
module.exports = {User};
좋은 강의 항상 감사드립니다.
답변을 작성해보세요.
2
andrewlee
질문자2020.05.10
userSchema.methods.findByToken= function(token,cb){
가 아니라
userSchema.Static.findByToken= function(token,cb){
이엇나 그랫을거에요
2
1
0
0
bonghyunyang2
2020.06.30
userSchema.statics.findByToken = function (token, cb) 이렇게 작성했는데 동일한 에러가 뜹니다 ㅠ
0
0
0
답변 8