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

Posted

技术标签:

【中文标题】TypeError:无法读取未定义 Passpor 错误的属性“名称”【英文标题】:TypeError: Cannot read property 'name' of undefined Passpor error 【发布时间】:2020-12-26 08:38:36 【问题描述】:

我正在制作一个登录和注册页面。我正在使用护照进行身份验证。我也在用猫鼬。一切正常,但我不知道为什么 user.name 未定义。我尝试了在堆栈上找到的与此问题相关的每一个解决方案,但都不匹配。

路由器.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 [as 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 [as 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) 在 Immediate._onImmediate (C:\Users\Miguel\Desktop\RestaurantControl\node_modules\express-session\index.js:502:7) 在 processImmediate (internal/timers.js:460:21)

【问题讨论】:

可以调试一下吗?有几次名称被使用。其中之一是在对象未定义时发生。考虑追踪它。 user.name 未定义...user 未定义。所以你应该明白为什么你没有获得用户。 @Diesel 我正在使用的库“Passport”将数据从“登录页面的表单”放入对象“用户” @evolutionxbox 我会的 如果错误在req.user.name线上,则请求存在。但它没有返回用户属性。这就是你的问题所在。我不知道为什么 req 没有​​给用户。 【参考方案1】:
router.get('/', checkAuthorization, async (req, res) => 
    const result = await req.user
    res.render('index.ejs', data =  name: result.name) )

req.user 如果您使用护照模块,将返回承诺。 await req.userasync function。我遇到了同样的问题并想出了这个解决方案。

【讨论】:

以上是关于TypeError:无法读取未定义 Passpor 错误的属性“名称”的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取未定义的属性(读取“名称”)

TypeError:无法读取未定义的属性“findAll”(expressjs)

TypeError:无法读取未定义的属性(读取“问题”)

TypeError:无法在 gitlab 中读取未定义的属性(读取“读取”)

TypeError:无法读取未定义的属性(读取“国家”)

TypeError:无法读取未定义的属性(读取“匹配”):