req.user не определено в другой модели - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть 2 модуля

  1. пользователи
  2. блоги

Я ввел пользователей для регистрации в системе с паспортной аутентификацией.Когда я пытаюсь использовать текущие пользовательские данные (req.user) в модели блога, это приводит к 'undefined'.

Я делюсь своим кодом ниже

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);
         } 
    }); 
}); 
}

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы инициируете passport (который обрабатывает req.user) только для Users маршрутизатора, таким образом, только маршруты, начинающиеся с /users, фактически будут иметь доступ к req.user.

.используйте req.user внутри модуля Blogs, вам нужно запустить passport для всего приложения express (а не только для маршрутизатора пользователя).

Возможно, вы захотите переместить инициализацию в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());
1 голос
/ 29 апреля 2019

Я считаю, что ваша проблема в том, что вы используете несколько объектов / экземпляров экспресс-пакетов и пытаетесь перейти от одного к другому. Это не будет работать, как ожидалось. Чтобы это работало, у вас должно быть несколько маршрутов, использующих один и тот же экспресс-экземпляр.

...