2015-05-01 2 views
1

Я пытаюсь вызвать функцию passport.authenticate как ответ на запрос на отправку для моего регистрационного представления. Я следил за this tutorial here, чтобы получить мою голову в паспорт.js и выразить, но, выполнив первую страницу инструкций и внеся необходимые изменения для express.js 4.0 на каждой странице, я попытаюсь получить сообщение об ошибке возврата 500 и отобразит следующую таблицу:Как правильно называть функции passport.js с помощью экспресс-маршрутизатора?

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); 

ответ

3

The причина, по которой вы получаете ошибку, заключается в том, что вы экспортируете функцию, которая принимает app и passport в качестве параметров для вашего http handlers, но когда вы требуете его в своем server.js, вы не пропустите passport или 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 вы могли бы пройти как app и passport и просто крепят обработчик app

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

затем в сервере. 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); 
+0

Этот ответ имеет смысл, но когда я пытаюсь запустить npm, вы получите следующую ошибку: 'TypeError: функция объекта (req, res, next) { app.handle (req, res, next); } не имеет метода 'authenticate'' – jessenorton

+1

Это очень интересно, я думаю, я понимаю, что происходит. Попробуйте вернуть «router» в экспортированную функцию в файле маршрутов. Я отредактировал свой ответ. – Nindaff

+0

Таким образом, я уверен, что это порождало ошибку, потому что 'app.use' требует в качестве параметра обработчика http, но файл маршрутов не возвращал' router' в экспортированную функцию. – Nindaff

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));

+0

Можете ли вы объяснить, почему это необходимо ry, чтобы вернуть приложение как функцию? Когда я пытаюсь внести изменения, приложение начнет нормально, но если я попытаюсь загрузить страницу, он просто скажет «ожидание localhost ...» и нигде не попадает. Консоль тоже ничего не регистрирует. – jessenorton

+0

Следующая модификация должна помочь module.exports = function (паспорт) {... return router; } Вам не нужно передавать «приложение», если вы хотите включить маршруты с server.js, например app.use ('/', маршруты (паспорт)); – Vladimir

Смежные вопросы