TypeError:passport.initialize不是函数

时间:2017-05-01 08:14:18

标签: node.js mongoose passport.js passport-local

我使用Node.js和护照,但由于某种原因我似乎无法访问passport.initialize函数。它在另一个文件中工作,但当我试图在另一个项目(下面的文件)上使用它时,它将无法正常工作。

我添加相关文件。

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

3 个答案:

答案 0 :(得分:1)

我相信你这样做是错误的,而不是

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

您应该使用

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

那应该解决它

答案 1 :(得分:0)

我正在使用 ExpressJS + TS 并且以下返回了相同的错误。

import * as passport from 'passport';

app.use(passport.initialize());

然而,这有效

import { initialize } from 'passport';

app.use(initialize());

不确定为什么在带有 TS 的 ExpressJS 应用程序中会发生这种情况。我还使用 TS 在 Google Cloud Function 上实现了第一种方法,效果很好。

答案 2 :(得分:0)

我在 VS 代码中也遇到了同样的错误,希望对您有所帮助 你好!伙计,你写的一切都是正确的,但一些正常的语法错误。很难找到

这是我的代码,可帮助您实现身份验证

只是我在 Const

的地方使用了 var

app.js 代码

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

您可以更改本地端口

根据您的要求进行一些更改,然后就可以了