'Route.get() requires a callback issue when using passport trying to authenticate with Facebook

I am trying to authenticate users to my app using Facebook. I made sure that the configuration on https://developers.facebook.com/apps/1137899716785088/settings/basic/ is as it should ie: I added http://localhost:3000 as an app domain (after clicking save it still got converted to "localhost" only, but I guess that is okay. The error I get when loading my website is:

throw new Error(msg);
        ^

Error: Route.get() requires a callback function but got a [object Object]

I have already checked these threads: 1, 2, 3 but none of them solved my issue. Below is my code

passport/facebook.js

const passport = require('passport');
const facebookStrategy = require('passport-facebook').Strategy;
const User = require('../models/user');
const keys = require('../config/keys');

// fetch user ID and generate cookied ID for browser
passport.serializeUser((user, done) => {
    done(null, user.id);
});
passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user);
    });
});

passport.use(new facebookStrategy({
    clientID: keys.FBAppID,
    clientSecret: keys.FBAppSECRET,
    callbackURL: 'http://localhost:3000/auth/facebook/callback',
    profileFields: ['email', 'name', 'displayName', 'photos']
    // profileFields: ['id', 'email', 'gender', 'link', 'locale', 'name', 'timezone', 'updated_time', 'verified'],
}, (accessToken, refreshToken, profile, done) => {
    console.log(profile);
    // save user data
    User.findOne({facebook: profile.id}, (err, user) => {
        if (err) {
            return done(err);
        }
        if (user) {
            return done(null, user);
        } else {
            const newUser = {
                facebook: profile.id,
                firstname: profile.name.givenName,
                lastname: profile.name.familyName,
                image: `https://graph.facebook.com/${profile.id}/picture?type=large`,
                email: profile.emails[0].value
            }
            new User(newUser).save((err, user) => {
                if (err) {
                    return done(err);
                }
                if (user) {
                    return done(null, user);
                }
            })
        }
    })
}));

app.js

// load modules
const express = require('express');
const passport = require('passport');
// init app
const app = express();
app.use(passport.initialize())
app.use(passport.session());
// load passports
require('./passport/local');
require('./passport/facebook');
//passport authentication
app.get('/auth/facebook', passport.authenticate('facebook'), {
    scope: ['email']
});
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
    successRedirect: '/profile',
    failureRedirect: '/'
}));


Solution 1:[1]

The mistake was a syntactical one. I accidentally closed the round brackets immediately after the 'facebook' part, when in fact I shouldn't have done that.

Before fix: app.get('/auth/facebook', passport.authenticate('facebook'), {scope: ['email']});

After fix: app.get('/auth/facebook', passport.authenticate('facebook', {scope: ['email']}));

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 M.Ionut