console.log 和 node.js 中的重定向不起作用?
console.log and redirect in node.js doesn't work?
我申请了注册和登录,但有些地方不正常
这是 users.js 来自 routers/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;
这是来自 models/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里没显示我log对不对,重定向功能也不行。
好的,我快速查看了 passport
文档,看起来您的身份验证失败了,您被重定向到 failureRedirect
属性中指定的 url passport.authenticate
方法。
默认情况下 passport.authenticate
是这样工作的,如果身份验证失败,passport 将以 401 Unauthorized
状态响应,并且任何其他路由处理程序都不会调用。由于您已经为该方法指定了一些选项,特别是 url 重定向位置,passport 执行重定向而不是响应 401 Unauthorized
。这显示在命令提示符的提供屏幕上。首先,您会收到 302 Found
对 POST /users/login
的响应,然后您会被重定向到 GET /users/login
。
无论如何,请注意,如果身份验证失败,将不会调用任何额外的回调。
因此,很可能您从未达到 console.log
和 res.redirect('/');
,因为您从未通过身份验证。
我申请了注册和登录,但有些地方不正常
这是 users.js 来自 routers/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;
这是来自 models/user.js
的 user.jsvar 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里没显示我log对不对,重定向功能也不行。
好的,我快速查看了 passport
文档,看起来您的身份验证失败了,您被重定向到 failureRedirect
属性中指定的 url passport.authenticate
方法。
默认情况下 passport.authenticate
是这样工作的,如果身份验证失败,passport 将以 401 Unauthorized
状态响应,并且任何其他路由处理程序都不会调用。由于您已经为该方法指定了一些选项,特别是 url 重定向位置,passport 执行重定向而不是响应 401 Unauthorized
。这显示在命令提示符的提供屏幕上。首先,您会收到 302 Found
对 POST /users/login
的响应,然后您会被重定向到 GET /users/login
。
无论如何,请注意,如果身份验证失败,将不会调用任何额外的回调。
因此,很可能您从未达到 console.log
和 res.redirect('/');
,因为您从未通过身份验证。