我正在登录和注册页面。我正在使用护照进行身份验证。我也在用mongosse。一切正常,但是我不知道为什么user.name未定义。我尝试了在堆栈上找到的与该问题有关的每个解决方案,但是不匹配。
router.js
require('dotenv').config()
}
const bcrypt = require('bcrypt')
const path = require('path');
const express = require('express');
const User = require('../models/user');
const passport = require('passport');
const initializePassport = require('./passport-config')
const flash = require('express-flash')
const session = require('express-session');
const { JsonWebTokenError } = require('jsonwebtoken');
require('./db/mongoose');
const app = express();
const port = process.env.PORT || 3000;
const publicDirectoryPath = path.join(__dirname, '../public');
const viewsPath = path.join(__dirname, '../views');
initializePassport(
passport,
async(email)=>await User.findOne({email: email}),
async(id)=>await User.findById(id).then(console.log())
)
app.set('view engine', 'ejs');
app.set('views', viewsPath);
app.use(express.static(publicDirectoryPath));
app.use(express.urlencoded({extended: false}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session())
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false
}));
app.get('/registration',(req, res) => {
res.render('registration.ejs');
})
app.get('/login',(req, res) => {
res.render('login.ejs')
})
app.get('/menu',(req, res) => {
res.render('menu.ejs', { name: req.user.name })
})
app.post('/registration', async(req, res) => {
try{
const hashedPassword = await bcrypt.hash(req.body.password, 10);
const newUser = new User({
name: req.body.name,
email: req.body.email,
password: hashedPassword
});
newUser.save();
res.redirect('/login');
} catch{
res.redirect('/registration')
}
})
app.post('/login', passport.authenticate('local', {
successRedirect: '/menu',
failureRedirect: '/login',
failureFlash: true,
}))
app.listen(port, () => {
console.log('Server is on port 3000');
})
passport-config.js
const bcrypt = require('bcrypt')
function initialize(passport, getUserByEmail, getUserById){
const authenticateUser = async (email, password, done)=>{
const user = await getUserByEmail(email)
if(user == null){
return done(null, false, {message: 'No existe un usuario con ese email'})
}
try{
const matchPassword = await bcrypt.compare(password, user.password)
if(matchPassword){
return done(null, user)
}else{
return done(null, false, {message: 'Constraseña Incorrecta'})
}
}catch(e){
return done(e);
}
}
passport.use(new LocalStrategy({usernameField: 'email'}, authenticateUser))
passport.serializeUser((user,done)=> done(null, user.id))
passport.deserializeUser((id,done)=> {
return done(null, getUserById(id))})
}
module.exports = initialize
错误如下:
TypeError:无法读取未定义的属性“名称” 在C:\ Users \ Miguel \ Desktop \ RestaurantControl \ src \ router.js:58:45 在Layer.handle [作为handle_request](C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express \ lib \ router \ layer.js:95:5) 在下一个(C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express \ lib \ router \ route.js:137:13) 在Route.dispatch(C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express \ lib \ router \ route.js:112:3) 在Layer.handle [作为handle_request](C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express \ lib \ router \ layer.js:95:5) 在C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express \ lib \ router \ index.js:281:22 在Function.process_params(C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express \ lib \ router \ index.js:335:12) 在下一个(C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express \ lib \ router \ index.js:275:10) 在即时._onImmediate(C:\ Users \ Miguel \ Desktop \ RestaurantControl \ node_modules \ express-session \ index.js:502:7) 在processImmediate(internal / timers.js:460:21)