在 Node+Express+Passport 应用程序中,res.locals.users 有效,但数据未定义
In Node+Express+Passport app, res.locals.users works, but data is undefined
我正在使用 NodeJS、Express 和 Passport 制作应用程序,但我在视图中显示用户数据时遇到问题。
我在 res.locals.user 中获得了用户的 ObjectID,但其中的数据(如姓名、电子邮件等)返回为“未定义”。例如,console.log(res.locals.user) returns "5ef5ddd2e67f9e2918e79bcb" 但 console.log(res.locals.user.name) 或 console.log(user.name ) returns“未定义”。
澄清一下:
在 EJS 中,如果我输入 <%= user %>
,它会显示数据库中用户的对象 ID。如果我输入 <%= user.name %>
它不会呈现并且控制台显示“未定义”。
这是我的护照-本地-strategy.js:
const express = require('express');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/users');
passport.use(new LocalStrategy({
usernameField: 'email'
},
function (email, password, done) {
User.findOne({ email: email }, function (err, user) {
if (err) {
console.log('Error in finding user --> Passport');
return done(err);
}
if (!user || user.password != password) {
console.log('Invalid username or password');
return done(null, false);
}
return done(null, user);
});
}
));
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
if (err) {
console.log('Error in finding user --> Passport');
return done(err);
}
return done(null, user.id);
});
});
passport.checkAuthentication = function (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
return res.redirect('/users/sign-in');
};
passport.setAuthenticatedUser = function (req, res, next) {
if (req.isAuthenticated()) {
res.locals.user = req.user;
console.log(res.locals.user);
}
next();
}
module.exports = passport;
我通过使用异步和等待块将 res.locals.user 分配给 User.findById 来修复它。
passport.setAuthenticatedUser = async function (req, res, next) {
if (req.isAuthenticated()) {
res.locals.user = await User.findById(req.user, function (err, user) {
if (err) {
console.log('Error in finding user --> Passport');
}
return;
});
}
next();
}
我正在使用 NodeJS、Express 和 Passport 制作应用程序,但我在视图中显示用户数据时遇到问题。
我在 res.locals.user 中获得了用户的 ObjectID,但其中的数据(如姓名、电子邮件等)返回为“未定义”。例如,console.log(res.locals.user) returns "5ef5ddd2e67f9e2918e79bcb" 但 console.log(res.locals.user.name) 或 console.log(user.name ) returns“未定义”。
澄清一下:
在 EJS 中,如果我输入 <%= user %>
,它会显示数据库中用户的对象 ID。如果我输入 <%= user.name %>
它不会呈现并且控制台显示“未定义”。
这是我的护照-本地-strategy.js:
const express = require('express');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/users');
passport.use(new LocalStrategy({
usernameField: 'email'
},
function (email, password, done) {
User.findOne({ email: email }, function (err, user) {
if (err) {
console.log('Error in finding user --> Passport');
return done(err);
}
if (!user || user.password != password) {
console.log('Invalid username or password');
return done(null, false);
}
return done(null, user);
});
}
));
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
if (err) {
console.log('Error in finding user --> Passport');
return done(err);
}
return done(null, user.id);
});
});
passport.checkAuthentication = function (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
return res.redirect('/users/sign-in');
};
passport.setAuthenticatedUser = function (req, res, next) {
if (req.isAuthenticated()) {
res.locals.user = req.user;
console.log(res.locals.user);
}
next();
}
module.exports = passport;
我通过使用异步和等待块将 res.locals.user 分配给 User.findById 来修复它。
passport.setAuthenticatedUser = async function (req, res, next) {
if (req.isAuthenticated()) {
res.locals.user = await User.findById(req.user, function (err, user) {
if (err) {
console.log('Error in finding user --> Passport');
}
return;
});
}
next();
}