Javascript &引用;未解析的函数或方法“;使用Passport.JS

Javascript &引用;未解析的函数或方法“;使用Passport.JS,javascript,node.js,Javascript,Node.js,在设置passport.js和mongoose身份验证之后,我在所有相关语句中始终得到“未解析的函数或方法” 我尝试了使chaches无效,并与其他解决方法一起重新启动,但是,问题仍然存在 My user.js: var Schema = mongoose.Schema; var passportLocalMongoose = require('passport-local-mongoose'); //create user schema and model var User = new

在设置passport.js和mongoose身份验证之后,我在所有相关语句中始终得到“未解析的函数或方法”

我尝试了使chaches无效,并与其他解决方法一起重新启动,但是,问题仍然存在

My 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);
当我运行服务器时,我还收到错误:

TypeError:passport.serialize不是一个函数

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

所以,现在,您只需要创建一个控制器来处理用户注册等的业务逻辑。比如说,

*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


希望这有帮助。不要试图让您更改代码库,但这是一种更好的方法来完成您想要做的事情。

因此,现在,您只需要创建一个控制器来处理用户注册等的业务逻辑。比如说,

*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



希望这有帮助。不想让你改变你的代码库,但这是一个更好的方法来做你想做的事情。

漂亮的图片,没用,但很漂亮-我想它是
models/user.js
是你写的东西-你可能写错了-谁能说,如果代码是你的(不是它的图片),发布代码@JaromandaX图片仅用于显示webstorm无法识别这些方法,我很抱歉我理解,但如果您需要代码方面的帮助,请发布可能错误的代码(同样,假设models/user.js是您的代码)@JaromandaX I更新为包含我的user.jspretty pictures,无用,但是漂亮-我认为它
models/user.js
是你写的东西-你可能写错了-谁能说,如果代码是你的(不是它的图片)@JaromandaX包含这些图片只是为了表明webstorm没有识别这些方法,我很抱歉我理解,但是如果你需要代码方面的帮助,发布可能错误的代码(同样,假设models/user.js是您的代码)@JaromandaX我已更新以包含我的user.jsI感谢您的回复,但我的问题不在于设置,而是“未解决的函数或方法”错误添加链接可能会有所帮助。你付出的太少了,你把事情安排错了。passport local mongoose repo还提供了一个关于图书馆入门的博客教程。我会去看看的。实际上,您正在app.js文件中初始化Passport,但实际上并没有对其进行任何操作。在routes/index.js中,您应该执行以下操作:(无论如何类似于它)passport.authenticate('local',(req,res)=>{res.redirect('/');});查看Michael为此创建的博客。可以在以下位置看到:谢谢,我一定会查清楚的。是我的设置导致了
“未解决的函数或方法”
问题吗?因为即使我的设置整体上是错误的,webstorm是否仍能识别这些方法?我很感激这些回答,但我的问题不在于设置,而是“未解决的函数或方法”错误添加链接可能会有所帮助。你付出的太少了,你把事情安排错了。passport local mongoose repo还提供了一个关于图书馆入门的博客教程。我会去看看的。实际上,您正在app.js文件中初始化Passport,但实际上并没有对其进行任何操作。在routes/index.js中,您应该执行以下操作:(无论如何类似于它)passport.authenticate('local',(req,res)=>{res.redirect('/');});查看Michael为此创建的博客。可以在以下位置看到:谢谢,我一定会查清楚的。是我的设置导致了
“未解决的函数或方法”
问题吗?因为即使我的设置整体上是错误的,webstorm不应该仍然识别这些方法吗?