2016-06-11 5 views
2

내가 등록 및 로그인 응용 프로그램을 만들지 만, 뭔가console.log 및 node.js의 리디렉션이 작동하지 않습니까?

var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var multer = require('multer'); 
var upload = multer({dest: './uploads'}); 

var User = require('../models/user'); 

/* GET users listing. */ 
router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

router.get('/register', function(req, res, next) { 
    res.render('register', { 
    'title': 'Register' 
    }); 
}); 

router.get('/login', function(req, res, next) { 
    res.render('login', { 
    'title': 'Login' 
    }); 
}); 

router.post('/register', upload.single('profileimage'), function(req, res, next){ 
    //get form values 
    var name = req.body.name; 
    var email = req.body.email; 
    var username = req.body.username; 
    var password = req.body.password; 
    var password2 = req.body.password2; 

//check for image field 
    if(req.files && req.files.profileimage){ 
    console.log('Uploading File...'); 
    //var profileimage = req.file.filename; 

    //file info 
    var profileImageOriginalName = req.files.profileimage.originalname; 

    var profileImageName   = req.files.profileimage.name; 
    var profileImageMime   = req.files.profileimage.mimetype; 
    var profileImagePath   = req.files.profileimage.path; 
    var profileImageExt   = req.files.profileimage.extension; 
    var profileImageSize   = req.files.profileimage.size; 
    } else { 
    //set a default image 
    var profileImageName = 'noimage.png'; 
    } 

//form validation 
    req.checkBody('name','Name field is required').notEmpty(); 
    req.checkBody('email','Email field is required').notEmpty(); 
    req.checkBody('email','Email not valid').isEmail(); 
    req.checkBody('username','Username field is required').notEmpty(); 
    req.checkBody('password','Password field is required').notEmpty(); 
    req.checkBody('password2','Passwords do not match').equals(req.body.password); 

    //check for errors 
    var errors = req.validationErrors(); 

    if(errors){ 
    res.render('register', { 
     errors: errors, 
     name: name, 
     email: email, 
     username: username, 
     password: password, 
     password2: password2 
    }); 
    } else { 
    var newUser = new User({ 
     name: name, 
     email: email, 
     username: username, 
     password: password, 
     profileimage: profileImageName 
    }); 

    //create user 
    User.createUser(newUser, function(err, user){ 
     if(err) throw err; 
     console.log(user); 
    }); 

    //success message 
    req.flash('success', 'You are now registered and may log in'); 

    res.location('/'); 
    res.redirect('/'); 
    } 

}); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done){ 
    User.getUserByUsername(username, function(err, user){ 
     if(err) throw err; 
     if(!user){ 
     console.log('Unknown User'); 
     return done(null, false, {message: 'Unknown User'}); 
     } 
    User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) throw err; 
     if(isMatch){ 
     return done(null, user); 
     } else { 
     console.log('Invalid Password'); 
     return done(null, false, {message: 'Invalid Password'}); 
     } 
    }); 
    }); 
} 
)); 

router.post('/login', passport.authenticate('local',{failureRedirect: '/users/login', failureFlash: 'Invalid username or password'}), function(req, res){ 
    console.log('Authentication Successful'); 
    req.flash('success', 'You are logged in'); 
    res.redirect('/'); 
}); 

module.exports = router; 

을 users.js/제대로

이 라우터에서 users.js입니다 작동하지 않으며이 모델 /의 user.js에서의 user.js입니다

var mongoose = require('mongoose'); 
var bcrypt = require('bcrypt'); 

mongoose.connect('mongodb://localhost/nodeauth'); 
var db = mongoose.connection; 

//user schema 
var UserSchema = mongoose.Schema({ 
    username: { 
    type: String, 
    index:true 
    }, 
    password: { 
    type: String, 
    required: true, 
    bcrypt: true 
    }, 
    email: { 
    type: String 
    }, 
    name: { 
    type: String 
    }, 
    profileimage: { 
    type: String 
    } 
}); 

var User = module.exports = mongoose.model('User', UserSchema); 

module.exports.comparePassword = function(candidatePassword, hash, callback){ 
    bcrypt.compare(candidatePassword, hash, function(err, isMatch){ 
    if(err) return callback(err); 
    callback(null, isMatch); 
    }); 
} 

module.exports.getUserById = function(id, callback){ 
    User.findById(id, callback); 
} 

module.exports.getUserByUsername = function(username, callback){ 
    var query = {username: username}; 
    User.findOne(query, callback); 
} 

module.exports.createUser = function(newUser, callback){ 
    bcrypt.hash(newUser.password, 10, function(err, hash){ 
    if(err) throw err; 
    //set hashed pw 
    newUser.password = hash; 
    //create user 
    newUser.save(callback); 
    }); 
} 

등록을 사용할 때 로그인을 사용할 때 작동하지 않지만 작동하지 않습니다. 구체적으로 내가 옳았는지 아닌지 여부를 cmd에 표시하지 않으며 리디렉션 기능이 작동하지 않습니다.

comand prompt

+0

나는 서버 스크립트라고 생각한다. 브라우저는 그것을 캡쳐 할 수 없다. cmd 콘솔에서 확인한다. :) – HoangHieu

+0

내가 알기에, 여기에 내가 http://i.stack.imgur.com/WMJRK.jpg를 로그 할 때 표시되는 내용이있다. – sanja

답변

0

좋아, 나는 passport 문서에 대한 빠른 모습을 가지고 당신의 인증이 실패하고 passport.authenticate 방법의 failureRedirect 소품에 지정된 URL로 리디렉션 것 같습니다. 기본적으로

passport.authenticate 인증이 실패 할 경우, 여권401 Unauthorized 상태로 응답하고, 추가 경로 핸들러가 호출되지 않습니다, 그래서 작동합니다. 메서드에 대한 몇 가지 옵션, 특히 리디렉션 할 URL을 지정 했으므로 여권401 Unauthorized 대신 리디렉션을 수행합니다. 이는 명령 프롬프트의 제공된 화면에 표시됩니다. 먼저 POST /users/login에 대한 응답이 302 Found이되어 GET /users/login으로 리디렉션됩니다.

어쨌든 인증에 실패하면 추가 콜백이 호출되지 않는다는 점에 유의하십시오.

인증을받지 않았으므로 아마도 대부분 console.logres.redirect('/');에 도달하지 않았을 것입니다.

+0

네,하지만 지금은 우리가 옳았는지 아닌지에 관계없이 항상 '인증 성공'을 표시합니다 ... – sanja

+0

어떻게 해결할 수 있습니까? – sanja

관련 문제