TASKMASTER
TASKMASTER

Reputation: 1021

TypeError:this.authenticate is not a function

After adding passport.authenticate in a post request to the register route, I get this error. According to tutorial everything is looking fine but even my home route is not working after adding this line of code. Is there any update of passport or something?

Here is my app.js:

require('dotenv').config();
const express=require("express");
const bodyParser=require("body-parser");
const ejs=require("ejs");
const mongoose=require("mongoose");
const session=require("express-session");
const passport=require("passport")
const passportLocalMongoose=require("passport-local-mongoose");

const app=express();
app.use(express.static("public"));
app.set('view engine','ejs');
app.use(bodyParser.urlencoded({extended:true}));
app.use(session({
  //js object with these properties
  secret:"our little secret",
  resave:false,
  saveUninitialized:false
}));
app.use(passport.initialize());
app.use(passport.session);

mongoose.connect("mongodb://localhost:27017/userDB",{useNewUrlParser:true, useUnifiedTopology: true,useCreateIndex:true});
//secure way to declare schema
const userSchema=new mongoose.Schema({
  email:String,
  password:String
});
//used to encrypt password basically this is the complete usage of encrypt package.also accessing environment variable

userSchema.plugin(passportLocalMongoose);

const User=new mongoose.model("User",userSchema);

passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.get("/",function(req,res){
  res.render("home");
});
app.get("/login",function(req,res){
  res.render("login");
});
app.get("/register",function(req,res){
  res.render("register");
});
app.get("/secrets",function(req,res){
  if(req.isAuthenticated()){
    res.render("secrets");
  }else{
    res.redirect("/login")
  }
})
app.post("/register",function(req,res){
User.register({username:req.body.username},req.body.password,function(err,user){
  if(err){
    console.log(err);
    res.redirect("/register");
  }else{
    passport.authenticate("local")(req,res,function(){
      res.redirect("/secrets");
    })
  }
})
});
app.post("/login",function(req,res){

});

app.listen(3000,function(){
  console.log("server running at port 3000")
});

Upvotes: 0

Views: 7091

Answers (1)

Mathew
Mathew

Reputation: 118

I believe you've missed a pair of parenthesis on passport.session method call.

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

Upvotes: 8

Related Questions