2017-04-26 69 views
0

「未解析函數或方法」在設置passport.js和貓鼬身份驗證之後,我始終在所有相關語句中獲得「未解析的函數或方法」。Passport.JS

enter image description here enter image description here

我試過無效chaches和其他的變通方法重新啓動一起,但是,這個問題一直存在。

我user.js的:

var Schema = mongoose.Schema; 
var passportLocalMongoose = require('passport-local-mongoose'); 

//create user schema and model 
var User = new Schema({ 
    username: String, 
    password: String, 
    studentID: String, 
    grades: [{ 
     subject: String, 
     grade: String 
    }] 
}); 

User.plugin(passportLocalMongoose); 

module.exports = mongoose.model('user', User); 

When I run the server, I also get the error:

TypeError: passport.serialize is not a function

+1

漂亮的圖片,無用的,但漂亮 - 我認爲'models/user.js'是你寫的東西 - 你可能寫錯了 - 誰可以說,發佈代碼,如果它是你的(不是它的圖片) –

+0

@JaromandaX這些圖片僅僅是爲了表明webstorm沒有認識到這些方法,我的歉意 – Markoe7

+0

我明白,但是如果你想要代碼的幫助,請發佈**你的**代碼可能是錯誤的(再次假設模型/用戶。 js是你的代碼) –

回答

0

user.js的

const mongoose = require('mongoose'); 
const bcrypt = require('bcrypt-nodejs'); 

const Schema = mongoose.Schema; 

//= =============================== 
// User Schema 
//= =============================== 
const UserSchema = new Schema({ 
    email: { 
    type: String, 
    lowercase: true, 
    unique: true, 
    required: true 
    }, 
    password: { 
    type: String, 
    required: true 
    } 
    }); 


// Pre-save of user to database, hash password if password is modified or new 
UserSchema.pre('save', function (next) { 
    const user = this, 
    SALT_FACTOR = 5; 

    if (!user.isModified('password')) return next(); 

    bcrypt.genSalt(SALT_FACTOR, (err, salt) => { 
    if (err) return next(err); 

    bcrypt.hash(user.password, salt, null, (err, hash) => { 
     if (err) return next(err); 
     user.password = hash; 
     next(); 
    }); 
    }); 
}); 

// Method to compare password for login 
UserSchema.methods.comparePassword = function (candidatePassword, cb) { 
    bcrypt.compare(candidatePassword, this.password, (err, isMatch) => { 
    if (err) { return cb(err); } 

    cb(null, isMatch); 
    }); 
}; 

module.exports = mongoose.model('User', UserSchema); 

passport.js

const passport = require('passport'); 
const User = require('../models/user'); 
const config = require('./main'); 
const LocalStrategy = require('passport-local'); 

// username field is now email 
const localOptions = { 
    usernameField: 'email' 
}; 

// set up the local login strategy 
const localLogin = new LocalStrategy(localOptions, (email, password, done) => { 
    User.findOne({ email }, (err, user) => { 
    if (err) { return done(err); } 
    if (!user) { return done(null, false, { error: 'Your login details could not be verified. Please try again.' }); } 

    user.comparePassword(password, (err, isMatch) => { 
     if (err) { return done(err); } 
     if (!isMatch) { return done(null, false, { error: 'Your login details could not be verified. Please try again.' }); } 

     return done(null, user); 
    }); 
    }); 
}); 

passport.use(localLogin); 
0

所以,現在,您只需創建一個控制器來處理用戶註冊的業務邏輯等等。例如,

* UserController.js *

// other functions 

// register 
export function register() { 
    if (!req.body) { 
    res.status(500).json({ error: 'All Fields Required.' }); 
    } 

    const user = new User(req.body) 

    user.save((err, user) => { 
    if (err) { 
     res.status(500).json({ err }); 
    } 
    res.status(200).json({ user }); 
    }) 
} 

router.js

// other important things to require 
const passportService = require('./config/passport'); 

// Middleware to require login/auth 
const requireLogin = passport.authenticate('local', { session: false 
}); 

// your routes go here and you can access requireLogin now, like so: 

router.get('/users/:id', requireLogin, getUserById); 
router.post('/users', register); 

希望這有助於。不要試圖讓你改變你的代碼庫,但這是一個更好的方式來做你想做的事情。

+0

我很欣賞這些迴應,但是我的問題不在於安裝,它是「未解決的功能或方法」錯誤 – Markoe7

+0

添加鏈接可能會有所幫助。你給的東西很少能夠消除。 –

+0

https://github.com/Scyon/mtsd-schoolbook – Markoe7