【问题标题】:req.user undefined in other modelreq.user 在其他模型中未定义
【发布时间】:2019-04-29 19:38:54
【问题描述】:

我有 2 个模块

  1. 用户
  2. 博客

我已经实现了带有护照身份验证的登录注册用户。当我尝试在博客模型中使用当前用户数据(req.user)时,它会导致“未定义”。

我在下面分享了我的代码

app.js

const express = require('express');
const app =express();
const path = require('path');
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended : false }));
app.use(bodyParser.json());

const Users = require("./routes/Users");
const Blogs = require("./routes/Blog");
app.use("/users",Users);
app.use("/blogs",Blogs);

app.set('views',path.join(__dirname, 'views'));
app.set('view engine','ejs');

app.listen(3000, function() {
  console.log('Server started...');
});

users.js

const passport = require('passport');
const express=require('express');
const users = express.Router();
const models = require('../models');
const User = models.users;

var cookieParser = require('cookie-parser');
const session = require('express-session');

users.use(cookieParser());
users.use(session({
secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}));
users.use(passport.initialize());
users.use(passport.session());

require('../config/passport.js')(passport, User); 

users.post('/register',passport.authenticate('local-register', {
        successRedirect: '/users/profile', 
        failureRedirect: '/users/register'
    }
));

users.post('/login',passport.authenticate('local-login', {
        session: true,
        successRedirect: '/users/profile', 
        failureRedirect: '/users/profile'
    }
));

module.exports =users; 

blogs.js

const express = require('express');
const blogs = express.Router();
const blogModel = require('../models/blogs');


blogs.get('/',(req,res) =>{
    console.log(req.user) // RESULTS UNDEFINED
    res.send('Blog List');
});

passport.js

const bCrypt = require('bcryptjs');
const LocalStrategy = require('passport-local').Strategy;

module.exports = function(passport, user) { 
    const User = user;  

    passport.use('local-register', new LocalStrategy( { usernameField: 'email', passwordField: 'password', passReqToCallback: true },  
        function(req, email, password, done) { 
             ... ....

        } 
    ));

    passport.use('local-login', new LocalStrategy({ usernameField: 'email',  passwordField: 'password',   passReqToCallback: true },  
    function(req, email, password, done) {
        .....  .....
    }   
)); 

passport.serializeUser((user, done) => { 
    done(null, user.id); 
});

passport.deserializeUser((id, done) => { 
    const User =user;
    User.findById(id).then((user) =>{ 
        if (user) { 
            done(null, user);
        } else { 
            done(user.errors, null);
         } 
    }); 
}); 
}

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    您正在为Users 路由器启动passport(处理req.user),这样只有以/users 开头的路由才能真正访问req.user

    为了在Blogs 模块中使用req.user,您需要为整个express 应用程序(而不仅仅是用户路由器)启动passport

    您可能希望将初始化移动到 app.js 文件

    app.use(bodyParser.urlencoded({extended : false }));
    app.use(bodyParser.json());
    app.use(cookieParser());
    app.use(session({
    secret: 'keyboard cat',
      resave: false,
      saveUninitialized: true
    }));
    app.use(passport.initialize());
    app.use(passport.session());
    

    【讨论】:

      【解决方案2】:

      我相信您的问题是您正在使用多个对象/快递包实例并试图从一个传递到另一个。它不会按预期工作。要使其正常工作,您应该有多个使用相同 express 实例的路由。

      【讨论】:

      • 创建 1 个 express 对象并将其传递给多个文件并使用该对象。我相信它会起作用的。
      • @naranyansharama +1 为您的解决方案,它解决了我的其他问题。谢谢。
      • 很高兴知道这一点。请标记为正确答案。以便其他人可以利用这一点。
      猜你喜欢
      • 2018-02-23
      • 2017-09-17
      • 2021-04-22
      • 2021-08-16
      • 2015-07-18
      • 2021-12-27
      • 2016-04-01
      • 1970-01-01
      • 2017-06-13
      相关资源
      最近更新 更多