TypeError:无法读取未定义Passpor错误的属性“名称”

问题描述

我正在登录注册页面。我正在使用护照进行身份验证。我也在用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',res) => {
    res.render('login.ejs')
})

app.get('/menu',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,{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)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)