node.JS Express 护照路由

Posted

技术标签:

【中文标题】node.JS Express 护照路由【英文标题】:node.JS Express passport routing 【发布时间】:2015-01-03 01:34:09 【问题描述】:

我创建了一个简单的项目,有 3 个页面:主页、联系人和关于。

一切正常,然后我想用 mongo 添加用户注册。

所以我关注了这个tutorial

但是,当我添加一些新路线时,我无法访问更多页面。

这是我的index.js,当我可以访问我的 3 个页面时

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) 
  res.render('index',  title: 'Express' );
);



/* GET contact page. */
router.get('/contact', function(req, res) 
    res.render('contact');
);

/* POST contact page (submit). */
router.post('/contact', function(req, res) 
    res.render('contact',  name: req.param('name') );
);

/* GET home page. */
router.get('/home', function(req, res) 
    res.render('home');
);

/* POST home page (submit). */
router.post('/home', function(req, res) 
    res.render('home',  comm: req.param('comm') );
);


/* GET about page. */
router.get('/about', function(req, res) 
    res.render('about');
);


module.exports = router;

一切都简单而有效。 而现在,就是这样:

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) 
  res.render('index',  title: 'Express' );
);



/* GET contact page. */
router.get('/contact', function(req, res) 
    res.render('contact');
);

/* POST contact page (submit). */
router.post('/contact', function(req, res) 
    res.render('contact',  name: req.param('name') );
);

/* GET home page. */
router.get('/home', function(req, res) 
    res.render('home');
);

/* POST home page (submit). */
router.post('/home', function(req, res) 
    res.render('home',  comm: req.param('comm') );
);


/* GET about page. */
router.get('/about', function(req, res) 
    res.render('about');
);


module.exports = router;

module.exports = function(passport)

  // /* GET login page. */
  // router.get('/', function(req, res) 
  //   // Display the Login page with any flash message, if any
  //   res.render('index',  message: req.flash('message') );
  // );

  /* Handle Login POST */
  router.post('/login', passport.authenticate('login', 
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash : true
  ));

  /* GET Registration Page */
  router.get('/signup', function(req, res)
    res.render('register',message: req.flash('message'));
  );

  /* Handle Registration POST */
  router.post('/signup', passport.authenticate('signup', 
    successRedirect: '/home',
    failureRedirect: '/signup',
    failureFlash : true
  ));

  return router;

现在,没有显示任何路线。

有什么想法吗?

谢谢!

编辑:app.js

var express      = require('express');
var path         = require('path');
var favicon      = require('static-favicon');
var logger       = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');
var swig         = require('swig');

var dbConfig = require('./db.js');
var mongoose = require('mongoose');
mongoose.connect(dbConfig.url);

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

var app = express();

// Configuring Passport
var passport = require('passport');
var expressSession = require('express-session');
app.use(expressSession(secret: 'mySecretKey'));
app.use(passport.initialize());
app.use(passport.session());


// view engine setup
app.engine('html', swig.renderFile);

app.set('view engine', 'html');
app.set('views', path.join(__dirname, 'views'));

// view cache
app.set('view cache', false);
swig.setDefaults( cache: false );

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);

/// catch 404 and forwarding to error handler
app.use(function(req, res, next) 
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
);

/// error handlers

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


module.exports = app;

【问题讨论】:

显示调用该模块的代码(即app.js) 我很欣赏这是一篇旧帖子,但如果你还在想:你分配 model.export 两次有什么原因吗?我是节点新手,所以也许它是合法的,但是从 js pov 看来,您正在覆盖初始 model.export 中的所有内容 我不记得为什么了,我认为这是一个简单的初学者错误,正如你所说的,这是一篇旧帖子:) 【参考方案1】:

您的模块需要一个 passport 对象

module.exports = function(passport)

但您没有在 app.js 中使用护照对象调用它

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

另外,您需要在调用路由模块之前定义护照。所以最后你需要修改你的 app.js 看起来像这样:

var passport = require('passport');
var expressSession = require('express-session');
app.use(expressSession(secret: 'mySecretKey'));
app.use(passport.initialize());
app.use(passport.session());

...
var routes = require('./routes/index')(passport);
...
app.use('/', routes);

【讨论】:

我的问题是护照不会验证 main.js 文件之外的任何路由。将护照参数添加到导出中效果很好。谢谢!

以上是关于node.JS Express 护照路由的主要内容,如果未能解决你的问题,请参考以下文章

Node.js---中间件

Express4 和护照:无法验证

在 app.js 和路由 y node.js 之间共享一个对象

Express Passport (node.js) 错误处理

Express 路由丨Node.js-初识 Express

如何在 express 和 socket.io 中使用护照?