Nodejs路由器顺序

时间:2016-11-15 10:41:26

标签: javascript node.js express

我正在使用:

  

表达4.14   节点7.0+   会议1.14 +

我使用webstorm创建了Nodejs项目:

fooList match { case _ :: x :: _ => expensiveCalculation(x) match { case Some(calculationResult) => .... case None => } ... }

app.js

index.js

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

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

var app = express();

var check = function() {
    !req.session.status ? res.redirect('/user/login') : next();
}

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

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({secret: "inline", resave: false, saveUninitialized: true,     status: false}));

app.use('/', check, require('./routes/index'));
app.use('/user', require('./routes/user'));

module.exports = app;

user.js的

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

router.get('/', function(req, res, next) {
    res.render('index', { title: 'Express' });
});

module.exports = router;

当我向var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); router.get('/login', function(req, res, next) { res.render('login'); }); module.exports = router; 提出请求时,该页面提示我“重定向太多”,现在网址为localhost:3000

我的问题是什么?

2 个答案:

答案 0 :(得分:1)

修正:

var check = function(req, res, next) {
    !req.session.status ? res.redirect('/user/login') : next();
}




但我会为你写出更美妙的解决方案,希望你能有所了解:

app.js

app.use(require('./routes'));

routes文件夹:

routes/
 |- index.js
 |- common/
    |- auth.js
 |- root/
    |- index.js
    |- posts.js
 |- backend/
    |- index.js
    |- posts.js
    ...

1)routes/index.js

const
  express = require('express'),
  router = express.Router();

// guarded routes
function guardFn(req, res, next) {
  let authenticated = req.session && req.session.authenticated === true;
  authenticated ? next() : res.redirect('/auth');
}
router.use('/backend', guardFn, require('./backend'));

// public routes
router.use('/auth', require('./common/auth'); // for auth purposes
router.use('/', require('./root')); // for routes that starts from /, try not to rewrite /backend, /auth

module.exports = router;

2)routes/common/auth

const
  express = require('express'),
  router = express.Router();
  mongoose = require('mongoose'),
  User = mongoose.model('user');

router.get('/', (req, res) => {
  res.render('common/auth');
});

router.post('/', (req, res) => {
  User
    .findOne({
      username: req.body.username, 
      password: req.body.password
    })
    .exec((err, user) => {
      if(err) {
        console.error(err);
        return res.status(500).send('System error! Try again later');
      }
      if(!user) return res.redirect('back');
      req.session.user = user._id;
      req.session.authenticated = true;
      res.redirect('/backend');
    });
});

function logout(req, res, next) {
  delete req.session.user;
  req.session.authenticated = false;
  next();
}
router.delete('/auth', logout, (req, res) => res.send({success: true}));
router.get('/auth/destroy', logout, res => res.redirect('/auth'));

module.exports = router;

3)routes/root/index.js

const
  express = require('express'),
  router = express.Router();

router.get('/', (req, res) => {
  res.render('site/welcome');
});

module.exports = router;

4)routes/root/posts.js

const
  express = require('express'),
  router = express.Router(),
  mongoose = require('mongoose'),
  Post = mongoose.model('post');

router.get('/', (req, res) => {
  Post
    .find()
    .skip((req.query.page-1)*10)
    .limit(10)
    .exec((err, posts) => {
      res.render('site/posts/list', {posts});
    });
});

router.get('/:id', (req, res) => {
  Post
    .findById(req.params.id)
    .exec((err, post) => {
      if(err) {
        console.error(err);
        return res.status(500).send('System error! Try again later');
      }
      res.render('site/posts/show', {post});
    });
});

module.exports = router;

5)routes/backend/index.js

const
  express = require('express'),
  router = express.Router();

router.get('/', (req, res) => {
  res.render('backend/dashboard');
});

module.exports = router;

6)routes/backend/posts.js

const
  _ = require('lodash'),
  express = require('express'),
  router = express.Router(),
  mongoose = require('mongoose'),
  Post = mongoose.model('post');

router.get('/', (req, res) => {
  Post
    .find()
    .skip((req.query.page-1)*50)
    .limit(50)
    .exec((err, posts) => {
      res.render('backend/posts/list', {posts});
    });
});

router.get('/:id', (req, res) => {
  Post
    .findById(req.params.id)
    .exec((err, post) => {
      if(err) {
        console.error(err);
        return res.status(500).send('System error! Try again later');
      }
      res.render('backend/posts/show', {post});
    });
});

function updatePost(id, data, callback) {
  Post
    .findById(_id)
    .exec((err, post) => {
      if(err) return callback(err);
      if(!post) return callback('not found');

      post = _.extend(post, data);
      post.save(() => callback(null, post));
    });
}
router.put('/:id', (req, res) => {
  updatePost(req.params.id, req.body, (err, post) => {
    if(err) return res.status(500).send({success: false, err});
    res.send({success: true, post});
  });
});

router.post('/:id', (req, res) => {
  updatePost(req.params.id, req.body, (err, post) => {
    if(err) return res.status(500).send(err);
    res.redirect('/backend/posts');
  });
});

function createPost(data, callback) {
  let post = new Post();
  post = _.extend(post, req.body);
  post.save((err) => callback(err, post));
}
router.post('/', (req, res) => {
  createPost(req.body, (err, post) => {
    if(req.xhr) {
      if(err) return res.status(500).send({success: false, err});
      return res.send({success: true, post});
    }
    if(err) return res.status(500).send(err);
    res.redirect('/backend/posts');
  });
});

module.exports = router;

答案 1 :(得分:0)

据我了解,app.use('/', ...)将匹配所有请求,这就是为所有请求调用check方法的原因。

More good info here.

来自Express docs:

  

路由将立即匹配其路径后面的任何路径   “/".

     

例如:app.use(“/ apple”,...)将匹配“/ apple”,   “/ apple / images”,“/ apple / images / news”等等。

我建议重构:

var check = function(req, res, next) {
  if (!req.session.status && req.path != '/user/login') {
    res.redirect('/user/login');
  }
  else {
    next();
  }
}

app.use(check);
app.use('/', index);
app.use('/user', users);

因此check将针对所有请求执行,但仅在请求会话为假且请求路径与/user/login不匹配时重定向

请注意,如果未设置req.session,您的代码将会失败...