javascript - console.log 和 node.js 中的重定向不起作用?

标签 javascript node.js passport.js

我申请注册和登录,但有些东西无法正常工作

这是来自 routers/user.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;

这是来自 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中没有显示我的日志是否正确,并且重定向功能不起作用。

comand prompt

最佳答案

好的,我快速浏览了一下 passport文档,您的身份验证似乎失败,并且您被重定向到 failureRedirect 中指定的 url passport.authenticate的支柱方法。

默认passport.authenticate这样,如果身份验证失败,passport 将响应 401 Unauthorized状态,并且不会调用任何其他路由处理程序。由于您已为该方法指定了一些选项,特别是重定向的 url,passport 会进行重定向而不是响应 401 Unauthorized 。这显示在命令提示符提供的屏幕上。首先你会得到一个302 Found回复POST /users/login之后您将被重定向到 GET /users/login .

无论如何,请注意,如果身份验证失败,则不会调用任何其他回调。

所以,很可能,您从未达到 console.logres.redirect('/');因为你从未获得过身份验证。

关于javascript - console.log 和 node.js 中的重定向不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37762176/

相关文章:

javascript - 引用错误: Users is not defined

javascript - Nodejs Couchbase 从文档反序列化日期属性

javascript - VSCODE : No debug adapter, 无法发送 'variables' "

javascript - 如何将请求响应传递给另一个请求?

javascript - 自定义 Facebook 评论集成(JS SDK)

javascript - Node.JS/Passport/Sequelize - 使用错误密码登录

ajax - Passport.js Ajax 登录?

javascript - 如何让具体化固定 Action 按钮在 Angular 2 中工作

javascript - 如何使用 jQuery 禁用标签?

javascript - 如何在javascript中一次从数组中删除多个选定的项目