1

我正在尝试调用 passport.authenticate 函数作为对我的注册视图的发布请求的响应。我一直在关注本教程,以了解 passport.js 和 express,但是已经完成了第一页的说明并对 express.js 4.0 进行了必要的更改,我尝试访问的每个页面都会返回错误 500 并显示以下堆栈跟踪:

TypeError: Object #<serverResponse> has no method 'authenticate'
    at module.exports (/home/myUserName/Desktop/manufacturing/routes/index.js:66:37)
    at Layer.handle [as handle_request] (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/layer.js:82:5)
    at trim_prefix (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:302:13)
    at /home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:270:7
    at Function.proto.process_params (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:321:12)
    at next (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:261:10)
    at /home/myUserName/Desktop/manufacturing/node_modules/connect-flash/lib/flash.js:21:5
    at Layer.handle [as handle_request] (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/layer.js:82:5)
    at trim_prefix (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:302:13)
    at /home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:270:7

以下是 /routes/index.js 的代码:

var express = require('express');
var bodyParser = require('body-parser');
var router = express.Router();

module.exports = function(app, passport) {
  /* GET home page. */
  router.get('/', function(req, res, next) {
    res.render('index', {
      title: 'Home Page'
    });
  });

  /* GET about page */
  router.get('/about', function(req, res, next) {
    res.render('about', {
      title: 'About Us'
    });
  });

  /* GET contact page */
  router.get('/contact', function(req, res, next) {
    res.render('contact', {
      title: 'Contact Us'
    });
  });

  /* GET login page */
  router.get('/login', function(req, res, next) {
    res.render('login', {
      title: 'User Login',
      message: req.flash('loginMessage')
    });
  });

  /* GET register page */
  router.get('/register', function(req, res, next) {
    res.render('register', {
      title: 'User Registration',
      message: req.flash('signupMessage')
    });
  });

  /* POST register page */
  router.post('/register', passport.authenticate('local', {
    successRedirect : '/',
    failureRedirect : '/register',
    failureFlash    : true
  }));

  /* Log Out */

  router.get('/logout', function(req, res, next) {
    req.logout();
    res.redirect('/');
  });

  /* 404 - page not found */
  router.get('*', function(req, res){
    res.render('404', {
      title: '404 - Not Found'
    });
  });

  // Route middleware to make sure a user is logged in
  function isLoggedIn(req, res, next) {
    if (req.isAuthenticated())
      return next();
    res.redirect('/');
  };
};

这是我的 server.js:

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

// Database

var configDB = require('./config/database.js');
mongoose.connect(configDB.url);
require('./config/passport')(passport); 

// Routes
var routes = require('./routes/index');

var port = process.env.PORT || 3000;
var app = express();

// Express configuration
app.use(logger('dev')); // log every request to console
app.use(bodyParser.json()); // get information from html forms
  app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser()); // read cookies (needed for auth)
app.use(express.static(path.join(__dirname, 'public')));

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
if (app.get('env') === 'development') {
  app.locals.pretty = true;
}

// Passport configuration

app.use(session({ secret: 'MySecretHere',
                  saveUninitialized: true,
                  resave: true})); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(flash()); // use connect-flash for flash messages stored in session

app.use('/', routes);

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

app.listen(port);
console.log('Server running on ' + port);
4

2 回答 2

3

您收到错误的原因是因为您导出了一个函数,该函数将apppassport作为 http 处理程序的参数,但是当您需要它时,您server.js没有传递passportor app

您需要以某种方式传递passport到要求中。您可以将您的路线文件更改为如果您正在使用express.Router

   var router = express.Router();
   module.exports = function(passport) {
       // init your routes with passport and router
       router.post('/' function(req, res) {
          //...
       });
      // make sure to return router in the function though
      return router;
   }

如果不使用express.Router,您可以同时传递apppassport简单地将处理程序附加到app

   module.exports = function (app, passport) {
       app.post('/', function(req, res) {
         //...
       });
       // no need to return app
   }

然后在 server.js

     // if your using `express.Router()` in routes file
     app.use('/', require('./routes')(passport));
     // If your registering handler on app itself just bootstrap it
     require('./routes')(app, passport);
于 2015-05-01T15:32:13.673 回答
0

您需要将护照传递到您的路线。您可以通过以下方式更改代码:

/routes/index.js
module.exports = function(app, passport) {...}
module.exports = function(passport){ return function(app) {...}}

/server.js
app.use('/', routes);
app.use('/', routes(passport));

于 2015-05-01T15:30:46.197 回答