节点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'...
- 无法使用节点检查器debuggingNodejs:websocket_closed和Assertion失败:未知的实验canvasInspection
- 如何从CollectionFS获取文件(映像)的缓冲区
- cross domain CORS支持backbone.js
- Node.js:configuration和路由在一个不同的文件
- 如何在nodeclipse中执行nodejs热部署,enide studio,express server?
- 通过Mongoose的ObjectId查找MongoDB文档
- Express + Angular,总是发送html请求的索引文件,而不是api请求
- 如何在我的Heroku Node Express应用程序中使用LetsEncrypt SSL证书?
- MongoDB和Node.js中的dynamic查询
- 即使用户重新加载页面,如何保持function运行
- 使用RedisStore时,有什么方法可以查看当前会话吗?