节点JS:login不起作用

我已经在使用.hbs模板的Node上使用了Express。 我正在使用护照来validation特定的用户。 我在MongoDB中使用的数据库。

这是我的注册路线:

var express = require('express'); var router = express.Router(); var passport = require('passport'); var userServices = require('../services/user-services'); router.get('/', function(req, res, next) { var vm = { title: 'Join this web', }; res.render('signup', vm); }); router.post('/', function(req, res, next) { userServices.addUser(req.body, function(err){ if(err){ var vm = { title: 'Create an account', input: req.body, error: err }; delete vm.input.password; return res.render('signup', vm); } req.login(req.body, function(err) { res.redirect('/profile'); }); }); }); router.post('/login', passport.authenticate('local'), function(req, res, next){ res.redirect('/profile'); }); module.exports = router; 

这是我的login路线:

 var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { if (req.user) { return res.redirect('/profile'); } res.render('login', { title: 'Login' }); }); module.exports = router; 

我已经在我的passport-congig文件中定义了我的护照configuration:

 module.exports=function(){ var passport = require('passport'); var passportLocal = require('passport-local'); var userServices = require('../services/user-services'); passport.use(new passportLocal.Strategy({usernameField: 'email'}, function(email, password, next) { userServices.findUser(email, function(err, user){ if(err){ return next(err); } if(!user||user.password!==password){ return next(null, null); } next(null, user); }); })); passport.serializeUser(function(user, next){ next(null, user.email); }); passport.deserializeUser(function(user, next){ userServices.findUser(email, function(err, user){ next(err, user); }); }); }; 

另外,这里是我的app.js与护照相关的代码:

 var passportConfig = require('./auth/passport-config'); passportConfig(); var app = express(); app.use(expressSession({ secret:'trawel man', saveUninitialized: false, resave: false })); app.use(passport.initialize()); app.use(passport.session()); 

以下是我收到的错误的堆栈跟踪:

 Error: Not Found at C:\Users\James\MEAN\app.js:56:15 at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5) at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13) at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7 at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12) at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10) at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15 at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:246:14) at Function.proto.handle (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:166:3) at router (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:35:12) at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5) at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13) at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7 at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12) at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10) at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15 

这是我在我的服务器控制台:

POST /login 404 32.453 ms - 2847

我不知道为什么这不起作用。 我是Node新手。 有人帮我。

 // process the login form router.post('/login', passport.authenticate('local-login', { successRedirect: '/', // redirect to the home page failureRedirect: '/login', // redirect back to the login page if there is an error failureFlash: true // allow flash messages })); 

这是您应该使用的护照代码:(您需要添加您的用户模式path)

 // load all the things we need var LocalStrategy = require('passport-local').Strategy; // load up the user model var User = require('....'); //enter here user path schema // load the auth variables module.exports = function(passport) { // ========================================================================= // passport session setup ================================================== // ========================================================================= // required for persistent login sessions // passport needs ability to serialize and unserialize users out of session // used to serialize the user for the session passport.serializeUser(function(user, done) { done(null, user.id); }); // used to deserialize the user passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); // ========================================================================= // LOCAL LOGIN ============================================================= // ========================================================================= passport.use('local-login', new LocalStrategy({ // by default, local strategy uses username and password, we will override with email usernameField : 'email', passwordField : 'password', passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not) }, function (req, email, password, done) { if (email) email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching // asynchronous process.nextTick(function() { User.findOne({ 'local.email' : email }, function (err, user) { console.log(user); // if there are any errors, return the error if (err) return done(err); // if no user is found, return the message if (!user) return done(null, false, req.flash('loginMessage', 'No user found.')); if (!user.validPassword(password)) return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // all is well, return user else return done(null, user); }); }); })); }; 

编辑:我给你添加了一个在mongoDB中的User架构的例子,所以它会更容易改变你的代码:

  // load the things we need var mongoose = require('mongoose'); var bcrypt = require('bcrypt-nodejs'); var userSchema = mongoose.Schema({ local : { email : String, password : String } }); // generating a hash userSchema.methods.generateHash = function(password) { return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); }; // checking if password is valid userSchema.methods.validPassword = function(password) { return bcrypt.compareSync(password, this.local.password); }; // create the model for users and expose it to our app module.exports = mongoose.model('User', userSchema); //module.exports = userSchema; module.exports.schema = userSchema; 

你错过了/profile的路由,这就是为什么你最后的“Not Found”路由被调用的原因。

添加路线

 router.get('/profile', function (req, res, next) { var vm = { name : req.user ? req.user.name:null }; res.render('profile', vm); }) 

而且这个错误不会被抛出

编辑:

看起来好像在尝试login时出现错误,而不是之后。 这是因为您的POST login路由是在错误的文件中。 在您的login路线文件中,添加以下内容:

 router.post('/', passport.authenticate('local'), function(req, res, next){ res.redirect('/profile'); }); 

(确保导入依赖关系)

并从注册路线中删除router.post('/login'...