bookshelf.js 不适用于护照

bookshelf.js doesnt work with passport

我有一个带有书架和护照的简单授权面板,但是当我尝试登录时,我得到了白色的空白页 500。我尝试了我在网上找到的所有解决方案。请帮忙。

config/passport.js

...
    passport.use('local-login', new LocalStrategy({
            passReqToCallback : true
        },
        function(req, username, password, done) {
            User.where({username: username}).fetch().then(function(err, user) {
                if (err)  return done(err);
                if (!user) {
                    return done(null, false, req.flash('loginMessage', 'Cant find user!'));
                }
                user = user.toJSON();
                if(User.validPassword(password, user.password)){
                    return done(null, false, req.flash('loginMessage', 'Invalid pass!'));
                }
                return done(null, user);
            }).catch(function(err) {
                console.error(err);
            });
        }
    ));
...

routes/auth.js

...
router.post('/login', passport.authenticate('local-login', {
    successRedirect: '/users/profile',
    failureRedirect: '/auth/login',
    failureFlash: true
}));
...

server.js

const express       = require('express');
const session       = require('express-session');
const passport      = require('passport');
const flash         = require('connect-flash');
const path          = require('path');
const favicon       = require('serve-favicon');
const logger        = require('morgan');
const cookieParser  = require('cookie-parser');
const bodyParser    = require('body-parser');

const config        = require('./config/app.js');

const index         = require('./routes/index');
const auth          = require('./routes/auth');
const users         = require('./routes/users');

require('./config/passport.js')(passport);

const app = express();

app.set('env', config.website.env);

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')))
app.use(session({
    secret: config.security.salt,
    resave: true,
    saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.use('/', index);
app.use('/auth', auth);
...

我认为这里的主要问题在于 then() 的使用。它不采用 err 参数作为传统回调。

另一个小问题是 catch() 应该将错误转发给 passport 而不是仅仅记录它。

所以尝试将其更改为

passport.use('local-login', new LocalStrategy({
    passReqToCallback : true
  },
  function(req, username, password, done) {
    new User({username: username})
      .fetch()
      .then(function(user) {
         if (!user) {
           return done(null, false,
             req.flash('loginMessage', 'Cant find user!'));
         }
         user = user.toJSON();
         if (User.validPassword(password, user.password)) {
           return done(null, false,
             req.flash('loginMessage', 'Invalid pass!'));
         }
         return done(null, user);
      })
      .catch(function(err) {
         return done(err);
      });
    }
  ));

作为旁注,我对 User.validPassword() 有点困惑。它是否 return 是 true 无效密码的值?