我遵循教程"用MEAN Stack构建AngularJS和Node.js应用程序",并坚持使用"04。在页面刷新之间持续登录。mp4"
如本教程所述,某些中间件函数必须console.log req。用户对象。但这并没有发生。
包。json的依赖关系:
"body-parser": "~1.0.2",
"cookie-parser": "^1.1.0",
"express": "~4.1.2",
"express-session": "^1.1.0",
"jade": "~1.3.1",
"mongoose": "~3.8.9",
"morgan": "~1.0.1",
"passport": "^0.2.0",
"passport-local": "^1.0.0",
"serve-favicon": "~2.0.0",
"stylus": "~0.44.0"
server.js(全)
'use strict';
var express = require('express');
var env = process.env.NODE_ENV = process.env.NODE_ENV || 'development';
var app = express();
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var config = require('./server/config/config')[env];
require('./server/config/express')(app, config);
require('./server/config/mongoose')(config);
var User = mongoose.model('User');
passport.use(new LocalStrategy(function(username, password, done) {
User.findOne({username: username}).exec(function(error, user) {
if(error) { return done(error); }
if(user && user.authenticate(password)) {
return done(null, user);
} else {
return done(null, false);
}
});
}));
// !!!! this middleware must console.log req.user, but it is always undefined.
// req.session displays and seems like correct
app.use(function(req, res, next) {
// console.log(req.session);
console.log(req.user);
next();
});
passport.serializeUser(function(user, done) {
if(user) {
done(null, user._id);
}
});
passport.deserializeUser(function(id, done) {
User.findOne({_id: id}).exec(function(error, user) {
if(!user) {
return done(null, false);
}
return done(null, user);
});
});
require('./server/config/routes')(app);
app.listen(config.port);
console.log('listening on port ' + config.port + '...');
express.js(全)
'use strict';
var express = require('express');
var stylus = require('stylus');
var logger = require('morgan');
var body_parser = require('body-parser');
var cookie_parser = require('cookie-parser');
var session = require('express-session');
var passport = require('passport');
var favicon = require('serve-favicon');
module.exports = function(app, config) {
app.set('views', config.root_path + '/server/views');
app.set('view engine', 'jade');
function compile(str, path){
return stylus(str).set('filename', path);
}
app.use(stylus.middleware({
src: config.root_path + '/public',
compile: compile
}));
app.use(logger());
app.use(cookie_parser('multi vision unicorns'));
app.use(session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}));
app.use(body_parser());
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(config.root_path + '/public'));
app.use(favicon(config.root_path + '/public/favicon.ico'));
// development
// = = = = = = = = = = = =
if ('development' === app.get('env')) {
app.locals.pretty = true;
}
};
我现在可以通过POST使用护照模块登录,但是刷新页面后,登录状态没有保持,我需要重新登录。在教程中说,这个中间件
app.use(function(req, res, next) {
console.log(req.user);
next();
});
必须console.log用户对象,即使刷新页面。但事实并非如此。
本课的最终目标,是保持浏览器的登录状态,使登录后字段"username","password",按钮"Sign In"隐藏,刷新后保持隐藏。但似乎服务器也没有保持登录状态。可能是会话问题,也可能是其他问题。
请帮. .
= = = = = = = =
问题解决了,-必须删除"cookie: {secure: true}"部分:"app.use(session({secret: 'secret', key: 'sid', cookie: {secure: true}}));"因为它只适用于https
我认为您需要存储会话。(以CoffeeScript为例)
session = require 'express-session'
mongoStore = (require 'connect-mongo') session
app.use session
secret: 'super secret'
store: new mongoStore(db: 'session')
cookie:
secure: true
maxAge: 2592000000