简体   繁体   中英

TypeError: Cannot read property 'passport' of undefined nodejs

I'm currently working on a register and login system with Express, Node, Mongoose and Passport.js and the register mostly works fine , but there's a big issue with the login system. For some reason in the method I've created passport cannot read "passport" of undefined, so something is coming up as undefined but I can't seem to figure it out. I don't know why it's not working, any help please!!

this my code app.js

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const cors = require('cors');
const passport = require('passport');
const mongoose = require('mongoose');
const config = require('./config/database');

mongoose.connect(config.database);

mongoose.connection.on('connected', () => {
    console.log('Connected to database ' + config.database);
});

mongoose.connection.on('error', (err) => {
    console.log('Database error:' + err);
});


const app = express();
const users = require('./routes/users');
const port = 3000;

app.use(cors());
app.use(express.static(path.join(__dirname, 'public')));

app.use(bodyParser.json());

app.use(passport.initialize());
app.use(passport.session());

app.use('/users', users);

app.get('/', (req, res) => {
 res.send('Invalid Endpoint');
});

app.listen(port, () =>{
console.log('Server started on port' + port);
});

 users.js const express = require('express'); const router = express.Router(); const passport = require('passport'); const jwt = require('jsonwebtoken'); const User = require('../models/user'); router.post('/register', (req, res, next) =>{ let newUser = new User({ name: req.body.name, email: req.body.email, username: req.body.username, password: req.body.password }); User.addUser(newUser, (err, user) => { if(err){ res.json({success: false, msg:'Failed to register user'}); }else { res.json({success: true , msg:'User registered'}); } }); }); router.post('/authenticate', (req, res, next) =>{ res.send('AUTHENTICATE'); }); router.get('/profile', (req, res, next) =>{ res.send('PROFILE'); }); module.exports = router;

Your issue is with passport session. You need to use express session (remember to install in your dependencies) before it for it to work properly.

Your app.js should look like this:

 const express = require('express'); const path = require('path'); const bodyParser = require('body-parser'); const cors = require('cors'); const passport = require('passport'); const mongoose = require('mongoose'); const config = require('./config/database'); const session = require("express-session"); mongoose.connect(config.database); mongoose.connection.on('connected', () => { console.log('Connected to database ' + config.database); }); mongoose.connection.on('error', (err) => { console.log('Database error:' + err); }); const app = express(); const users = require('./routes/users'); const port = 3000; app.use(cors()); app.use(express.static(path.join(__dirname, 'public'))); app.use(bodyParser.json()); app.use(session({secret: "secret"}); app.use(passport.initialize()); app.use(passport.session()); app.use('/users', users); app.get('/', (req, res) => { res.send('Invalid Endpoint'); }); app.listen(port, () =>{ console.log('Server started on port' + port); });

Also, keep in mind that body parser is deprecated for Express 4.16.0 or higher. It has been re-added in methods express.json() and express.urlencoded() so if your Express version falls into that category, you can change your app.js to:

 const express = require('express'); const path = require('path'); const cors = require('cors'); const passport = require('passport'); const mongoose = require('mongoose'); const config = require('./config/database'); const session = require("express-session"); mongoose.connect(config.database); mongoose.connection.on('connected', () => { console.log('Connected to database ' + config.database); }); mongoose.connection.on('error', (err) => { console.log('Database error:' + err); }); const app = express(); const users = require('./routes/users'); const port = 3000; app.use(cors()); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(session({secret: "secret"}); app.use(passport.initialize()); app.use(passport.session()); app.use('/users', users); app.get('/', (req, res) => { res.send('Invalid Endpoint'); }); app.listen(port, () =>{ console.log('Server started on port' + port); });

I suggest adding comments to your code to keep it neat as well.

In case anyone else runs into this error:

express-session deprecated undefined resave option; provide resave option
express-session deprecated undefined saveUninitialized option; provide saveUninitialized option app.

In addition to @raijin30 answer, I had to add the properties below (:

    resave: true,
    saveUninitialized: true

Explanation as to why, can be found at: Node JS session error: express-session deprecated .

Had the same problem and noticed that passport got updated on Septmeber 23rd. So, I decided to install the previous version via npm using

npm install --save passport@0.4.1

This solved the issue for me. Not really sure how or why it happened in the first place, but it might help you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM