Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js PassportJS:未定义用户_Node.js_Express_Passport.js - Fatal编程技术网

Node.js PassportJS:未定义用户

Node.js PassportJS:未定义用户,node.js,express,passport.js,Node.js,Express,Passport.js,是的,我看到有人问了这个问题,但答案指向要么更改反序列化用户回调,要么更改Mongoose模型中的某些内容 我尝试了第一个,但没有用,我使用的是普通的ol'NodeJS驱动程序,所以我不太确定从哪里找出问题的根源 这是我的剧本: AUTHENTICATE.JS: var app = require('express'); var router = app.Router(); var assert = require('assert'); var bcrypt = require('bcrypt'

是的,我看到有人问了这个问题,但答案指向要么更改
反序列化用户
回调,要么更改Mongoose模型中的某些内容

我尝试了第一个,但没有用,我使用的是普通的ol'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('/');
});
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;
对于我的
app.js
文件,我尝试了一些类似问题中建议的修复,但并没有任何效果。这就是它看起来的样子:

APP.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('/');
});
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;

非常感谢您提供的任何帮助。

正如您包含的两个问题所指出的,您需要先定义
用户
类,然后才能使用它。它不是passportjs或expressjs提供的功能,您需要自己实现它,或者使用另一个模块来提供该功能(比如mongoose)

  • 在您共享的第一个SO链接中,答案建议OP在mongoose中实现一个用户模型(
    user
    )(这似乎是一个流行的选择)
  • 第二个链接通过在
    反序列化器
    函数中添加一个硬编码对象来表示用户,从而稍微简化了一些事情

这对你有用吗?你还需要帮助吗?谢谢你的回答,我为延迟回复道歉,但目前我仍在摸索。我理解Mongoose如何允许您创建模式,您可以为用户使用一个模式,然后在
反序列化用户
中使用该模式,但我不确定另一个示例与此有何关联,因为
用户
类从未定义过。目前,我可能只想创建自己的
User
对象,看看效果如何。