PassportJS:用户未定义

时间:2017-02-21 02:05:02

标签: node.js express passport.js

是的,我看到此问题已被问及herehere,但答案指向更改您的deserializeUser回调或更改Mongoose模型中的内容。

我已经尝试了第一个无效并使用常规的'NodeJS驱动程序,所以我不太确定在哪里查明我的问题的根本原因。

这是我的剧本:

AUTHENTICATE.JS:

var app = require('express');
var router = app.Router();
var assert = require('assert');
var bcrypt = require('bcrypt');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new LocalStrategy({
  usernameField: 'email',
  passwordField: 'password'
},
  function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
  if (err) { return done(err); }
  if (!user) {
    return done(null, false, { message: 'Incorrect username.' });
  }
  if (!user.validPassword(password)) {
    return done(null, false, { message: 'Incorrect password.' });
  }
  return done(null, user);
    });
  }
));

router.post('/login',
   passport.authenticate('local', {successRedirect:'/',   
     failureRedirect:'/login',failureFlash: false}),
      function(req, res) {
      res.redirect('/');
});

对于我的app.js文件,我尝试了类似问题中提出的一些修复,但没有任何改变。这就是它的样子:

APP.JS:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var expressValidator = require('express-validator');
var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var mongo = require('mongodb').MongoClient;
var session = require('express-session');
var bcrypt = require('bcrypt');

// Express Session
app.use(session({
  secret: 'keyboard cat',
  saveUninitialized: true,
  resave: true,
  cookie: {secure: true}
}));


app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

//initialize passport for app
app.use(passport.initialize());
app.use(passport.session());

// make mongodb available to the application
app.use((req, res, next) => {
  mongo.connect('mongodb://localhost:27017/formulas', (e, db) => {
  if (e) return next(e);
  req.db = db;
  next();
  });
});

app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(express.static(__dirname + '/public'));

// Express Validator
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

  while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
  }
  return {
      param : formParam,
      msg   : msg,
      value : value
    };
   }
  }));

//define routes here


app.set('port', (process.env.PORT || 3000));

app.listen(app.get('port'), function(){
  console.log("The server is now listening on port "+app.get('port'));
});

module.exports = app;

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

正如您提到的两个问题所指出的那样,您需要首先定义User类,然后才能使用它。这不是passportjs或expressjs提供的东西,您需要自己实现它或使用另一个为您提供功能的模块(如mongoose)。

  • 在第一个SO链接中,您分享了答案,建议OP在mongoose中实现用户模型(User)(这似乎是一个受欢迎的选择)。
  • 第二个链接通过在deserializer函数中添加一个硬编码对象来代表用户来回答简化的事情。