yejielw
yejielw

Reputation: 19

TypeError: passport.initialize is not a function

Im using Node.js and passport, but for some reason i cant seem to access the passport.initialize function. it was working in another file but when i tried to use it on another project (the files below) wont work properly.

i add the relevant files.

server.js

const express = require('express');
const mongoose = require('mongoose');

const port = process.env.PORT || 3000;
const morgan = require('morgan');
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const app = express();
const authRoutes = require('./app/authRoutes.js');

mongoose.connect("mongodb://localhost/MeanMapApp");

const passport = require('./app/passport');
app.use(passport.initialize());

require('./app/routes.js')(app);

app.listen(port);
console.log('App listening on port ' + port);

passport.js

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

const User = require('../models/User');

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

passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user);
    });
});

authRoutes.js

var express = require('express');
const bluebird = require('bluebird');
const crypto = bluebird.promisifyAll(require('crypto'));
const passport = require('passport');
const User = require('../models/User');

/**
 * GET /login
 * Login page.
 */
exports.getLogin = (req, res) => {
    if (req.user) {
        return res.redirect('/account');
    }
    res.render('account/login', {
        title: 'Login'
    });
};
/**
 * POST /login
 * Sign in using email and password.
 */
exports.postLogin = (req, res, next) => {
    req.assert('email', 'Email is not valid').isEmail();
    req.assert('password', 'Password cannot be blank').notEmpty();
    req.sanitize('email').normalizeEmail({ remove_dots: false });

    const errors = req.validationErrors();

    if (errors) {
        req.flash('errors', errors);
        return res.redirect('/login');
    }

    passport.authenticate('local', (err, user, info) => {
        if (err) { return next(err); }
        if (!user) {
            req.flash('errors', info);
            return res.redirect('/login');
        }
        req.logIn(user, (err) => {
            if (err) { return next(err); }
            req.flash('success', { msg: 'Success! You are logged in.' });
            res.redirect('/account');
        });
    })(req, res, next);
};

/**
 * GET /logout
 * Log out.
 */
exports.logout = (req, res) => {
    req.logout();
    res.redirect('/');
};

/**
 * GET /signup
 * Signup page.
 */
exports.getSignup = (req, res) => {
    if (req.user) {
        return res.redirect('/account');
    }
    res.render('account/signup', {
        title: 'Create Account'
    });
};

/**
 * POST /signup
 * Create a new local account.
 */
exports.postSignup = (req, res, next) => {
    req.assert('email', 'Email is not valid').isEmail();
    req.assert('password', 'Password must be at least 4 characters long').len(4);
    req.assert('confirmPassword', 'Passwords do not match').equals(req.body.password);
    req.sanitize('email').normalizeEmail({ remove_dots: false });

    const errors = req.validationErrors();

    if (errors) {
        req.flash('errors', errors);
        return res.redirect('/signup');
    }

    const user = new User({
        email: req.body.email,
        password: req.body.password
    });

    User.findOne({ email: req.body.email }, (err, existingUser) => {
        if (err) { return next(err); }
        if (existingUser) {
            req.flash('errors', { msg: 'Account with that email address already exists.' });
            return res.redirect('/signup');
        }
        user.save((err) => {
            if (err) { return next(err); }
            req.logIn(user, (err) => {
                if (err) {
                    return next(err);
                }

                res.redirect('/account');
            });
        });
    });
};

Upvotes: 1

Views: 7159

Answers (3)

Mali Gautam H
Mali Gautam H

Reputation: 21

I also get the same err in the VS code hope it will help you hello! Buddy everything you write correct but some normal syntax err. it's hard to find

here is my code that helps you to implement the authentication

just I used var at the place of Const

app.js code

var express= require("express");
var mongoose=require("mongoose");
var passport = require('passport');
var bodyParser=require("body-parser");
var User = require("./models/user");
var localStrategy=require("passport-local").Strategy;
var passportLocalMongoose=require("passport-local-mongoose");
 mongoose.connect("mongodb://localhost/auth_demo_app",{ useNewUrlParser: true , useUnifiedTopology: true});
var app=express();
app.set("view engine" ,"ejs");
app.use(bodyParser.urlencoded({extended:true}));
app.use(require("express-session")({
    secret:"login",
    resave :false,
    saveUninitialized:false
}));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());


//=============================================================
//routes


app.get("/",function(req,res){
    res.render("home");
});

app.get("/secret",function(req,res){
    res.render("secret");
});


//Auth routes============
//show form
app.get("/register",function(req,res){
    res.render("register");
});

//heandling User Sign UP

app.post("/register",function(req,res){
     req.body.username
     req.body.password
     User.register(new User({username : req.body.username}),req.body.password,function(err,user){
        if(err){
            console.log(err);
            return res.render("register");
        }
        passport.authenticate("local")(req,res,function(){
              res.redirect("/secret");
        })

     });
});


app.listen(8080,function(){
    console.log("here i am");
});

you can change your local port

Do some changes as par your requirement and you good to go

Upvotes: 0

Kevin Aung
Kevin Aung

Reputation: 832

I'm using ExpressJS + TS and the following returned the same error.

import * as passport from 'passport';

app.use(passport.initialize());

However, this worked

import { initialize } from 'passport';

app.use(initialize());

Not sure why this is happening in the ExpressJS app with TS. I also have the first way implemented on a Google Cloud Function with TS and it works fine.

Upvotes: 1

Zadiki Hassan Ochola
Zadiki Hassan Ochola

Reputation: 778

I believe you are doing this the wrong way,instead of

const passport = require('./app/passport');
app.use(passport.initialize());

You should be using

var passport = require('passport');
require('./app/passport');
app.use(passport.initialize());

That should solve it

Upvotes: 5

Related Questions