2016-06-11 68 views
2

我提出申請,註冊和登錄,但事情不正常console.log和node.js中的重定向不起作用?

這是users.js從路由器/ users.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; 

,這是從模型/ 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文檔,它看起來像你的身份驗證失敗,你會得到重定向到在failureRedirect道具passport.authenticate方法指定的URL。

默認情況下passport.authenticate工作的話,如果認證失敗,護照將與401 Unauthorized響應狀態,和任何其他途徑處理程序將不會被調用。既然你已經指定了一些方法的選項,特別是一個URL重定向的地址,護照做了重定向而不是響應401 Unauthorized。這顯示在命令提示符提供的屏幕上。首先,您得到302 FoundPOST /users/login的迴應,之後您將重定向到GET /users/login

無論如何,請注意,如果驗證失敗,將不會調用任何其他回調。

因此,最有可能的是,您從未達到console.logres.redirect('/');,因爲您從未獲得認證。

+0

是的,但現在我們總是顯示「身份驗證成功」,無論我是否正確或未登錄... – sanja

+0

如何解決此問題? – sanja