ArK
ArK

Reputation: 21058

req.user undefined in other model

I have 2 modules

  1. users
  2. blogs

i have implemented users for login register with passport authentication . When i try to use current user data(req.user) in blog model it results 'undefined'.

i have share my code below

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

Upvotes: 0

Views: 68

Answers (2)

Ron537
Ron537

Reputation: 990

You are initiating passport (which handles req.user) only for Users router, this way only routes starting with /users will actually have access to req.user.

In order to use req.user inside the Blogs module, you need to initiate passport for the entire express app (instead of just the users router).

You would probably want to move the initialization to the app.js file

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

Upvotes: 1

narayansharma91
narayansharma91

Reputation: 2353

I believe your problem is you are using multiple objects/instance of express packages and trying to pass from one to another. It won't work as expected. To make it working you should have multiple routes using the same express instance.

Upvotes: 1

Related Questions