Javascript passport和mongoose的bcrypt错误

Javascript passport和mongoose的bcrypt错误,javascript,node.js,mongodb,passport.js,bcrypt,Javascript,Node.js,Mongodb,Passport.js,Bcrypt,Bcrypt抛出了一个不正确的参数错误,我在user.js userSchema.methods.comparePassword = (candidatePassword, callback) => { bcrypt.compare(candidatePassword, this, (err, isMatch) => { console.log('candidatePassword= ', candidatePassword, '& this= ', this)

Bcrypt抛出了一个
不正确的参数
错误,我在
user.js

userSchema.methods.comparePassword = (candidatePassword, callback) => {
  bcrypt.compare(candidatePassword, this, (err, isMatch) => {
    console.log('candidatePassword= ', candidatePassword, '&  this= ', this);
    if (err) { return callback(err); }
    callback(null, isMatch);
  });
};

   /* 
     candidatePassword=  bird
     this=  {}
     this.password=  undefined */
const passport = require('passport');
const ExtractJwt = require('passport-jwt').ExtractJwt;
const JwtStrategy = require('passport-jwt').Strategy;
const LocalStrategy = require('passport-local').Strategy;

const User = require('../models/user');
const config = require('../config');

var localOptions = {
  usernameField: 'email',
};

// Verifies user by checking if a password matches the specified email during signin
var localStrategy = new LocalStrategy(localOptions, function (email, password, done) {
  User.findOne({ email:email.toLowerCase()}, function (err, user) {
    console.log('/passport.js/localStrategy- user object: ', user)
    if (err) { return done(err); }
    if (!user) { return done(null, false); }
    user.comparePassword(password, function (err, isMatch) {
      console.log('/passport.js/localStrategy- password: ', password)
      if (err) { return done(err); }
      if (!isMatch) { return done(err, false); }
      return done(null, user);
    });
  });
}); 

// ... jwt strategy ...

passport.use(localStrategy);

/* 
  user object:  { _id: 58a1018dc3f89eb5955b8638,
  email: 'bird@bird.com',
  password: '$2a$10$lAJ9hoGKt9ggfk1TISfkOedxDIs/waLB5e4PccHAKt286XCKCY0/q',
  __v: 0 } */
用户对象作为空对象返回,因此
此密码未定义。我假设bcrypt.compare中的
this
参数引用了
userSchema
实例。userSchema在
passport.js中声明

userSchema.methods.comparePassword = (candidatePassword, callback) => {
  bcrypt.compare(candidatePassword, this, (err, isMatch) => {
    console.log('candidatePassword= ', candidatePassword, '&  this= ', this);
    if (err) { return callback(err); }
    callback(null, isMatch);
  });
};

   /* 
     candidatePassword=  bird
     this=  {}
     this.password=  undefined */
const passport = require('passport');
const ExtractJwt = require('passport-jwt').ExtractJwt;
const JwtStrategy = require('passport-jwt').Strategy;
const LocalStrategy = require('passport-local').Strategy;

const User = require('../models/user');
const config = require('../config');

var localOptions = {
  usernameField: 'email',
};

// Verifies user by checking if a password matches the specified email during signin
var localStrategy = new LocalStrategy(localOptions, function (email, password, done) {
  User.findOne({ email:email.toLowerCase()}, function (err, user) {
    console.log('/passport.js/localStrategy- user object: ', user)
    if (err) { return done(err); }
    if (!user) { return done(null, false); }
    user.comparePassword(password, function (err, isMatch) {
      console.log('/passport.js/localStrategy- password: ', password)
      if (err) { return done(err); }
      if (!isMatch) { return done(err, false); }
      return done(null, user);
    });
  });
}); 

// ... jwt strategy ...

passport.use(localStrategy);

/* 
  user object:  { _id: 58a1018dc3f89eb5955b8638,
  email: 'bird@bird.com',
  password: '$2a$10$lAJ9hoGKt9ggfk1TISfkOedxDIs/waLB5e4PccHAKt286XCKCY0/q',
  __v: 0 } */
我不太清楚问题出在哪里,因为似乎从mongodb返回了一个带有加密密码字段的用户对象,并且调用了
user.comparepassword()

我也使用相同的模式对象为用户注册


感谢任何帮助/提示

您只是在设置您的模型,以便它能够提取候选密码,但永远不会从数据库中找到存储的密码。因为这返回的是一个空对象,所以可能是电子邮件不匹配,或者是密码没有与存储的内容进行比较。尝试简化comparePassword函数并将“sync”添加到bcrypt.compare,这样就不需要回调

在模型中:


您可能还缺少序列化和反序列化部分!在passport.js中,我的代码拉入用户对象。console.log语句中的文本在底部进行注释。由于我在该方法中调用user.comparePassword,我假设bcrypt.compareSync可以通过使用
this
作为参数来访问user.js中的变量。有没有一个原因,我不能通过的对象,一旦我成功地拉进去?非常感谢。