2017-04-26 70 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