背景
我知道这个问题被问了一百万遍,但是这些问题都没有解决我的问题。在我的应用程序路由中,无论我访问哪个路由,调用req.user都只会返回未定义。
如果有帮助,我的登录功能也可以正常工作。我有登录/不登录时更改客户端的特定元素,但是无论如何req.user都返回undefined。
正如许多人指出的那样,这可能是我的中间件订购中的一个小问题,但是由于我的订购实际上是从大约3个不同的地方复制/粘贴的,所以我一生都找不到它地方。
我的应用程序的总体布局是一个主文件app.js,该文件设置了我的快速应用程序并包含我的所有路线。我所有的路线都在中间件设置下方。
相关的app.js代码
// Middleware
// Setup DB Pool and app
var pool = mysql.createPool(db.pool);
var app = express();
// Setup Handlebars
app.engine('handlebars', exprhbr({defaultLayout: 'index'}));
app.set('view engine', 'handlebars');
app.use(express.static('public'));
// Setup body parser
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Setup session
app.use(session({
cookie: { maxAge: 60000 },
secret: 'spooky',
resave: true,
saveUninitialized: true
}));
// Setup passport
app.use(passport.initialize());
app.use(passport.session());
...
// An example route
app.get('/', (req, res) => {
let loggedIn = req.isAuthenticated(); // works perfectly
console.log('user: ', req.user); // always prints "user: undefined"
res.status(200).render('home', {
page: 'Home',
noSearch: true,
loggedIn: loggedIn,
user: req.body.username
});
});
// My login route
app.post('/login', (req, res, next) => {
if (verify.login(req.body)) {
passport.authenticate('local', {
session: true,
successRedirect: '/user/' + req.body.username,
failureRedirect: '/login'
})(req, res, next);
}
});
护照
我使用以下方法初始化护照:
require('./src/passport')(passport);
在我文件的顶部,并且所说的护照文件如下所示:
相关的password.js代码
var strategy = require('passport-local').Strategy;
var bcrypt = require('bcrypt');
var mysql = require('mysql');
var db = require('./database');
var pool = mysql.createPool(db.pool);
module.exports = (passport) => {
passport.serializeUser((user, done) => {
done(null, user.uid);
});
passport.deserializeUser((uid, done) => {
pool.query('SELECT * FROM User WHERE (user_id = ?)', [uid], (err, result) => {
done(err, {uid: result[0].user_id, username: result[0].username, pass: result[0].password});
});
});
// Setup Passport
passport.use(new strategy({ usernameField: 'username' }, (username, pass, done) => {
// Match a user
pool.query('SELECT * FROM User Where (username = ?)', [username], (err, result) => {
if (!result.length) return done(null, false, {message: 'Username isn\'t registered'});
let user = result[0];
// User was found so decrpt pass
bcrypt.compare(pass, user.password, (err, isMatch) => {
if (err) throw err;
// User matches
if (isMatch)
return done(null, {uid: user.user_id, username: username, pass: user.password});
else
done(null, false, {message: 'Password doesn\'t match'})
});
});
}));
}
如果有帮助的话,交换我的函数声明的顺序也无济于事。
感谢您抽出宝贵的时间阅读这篇长篇文章,并有可能帮助我!
答案 0 :(得分:0)
就目前而言,我的网站在刷新了几页后就退出了您的登录,而且在大多数情况下,我没有注意到这种情况。
出现问题是因为我正在检查req.user中是否有未登录的用户,因此返回它的唯一逻辑原因是未定义。因为我没有注意到我已注销,所以我认为无论用户登录如何,它的输出都是不确定的。
我首先通过检查req.user是否存在来确认已登录用户的存在,然后相应地设置变量,以解决此问题。