2016-11-15 82 views
0

我使用:路由器的NodeJS爲了

表達4.14 節點7.0+ 會議1.14+


我創建項目的NodeJS與webstorm:

app.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; 

index.js

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

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

module.exports = router; 

user.js的

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,頁面提示我說,「過多的重定向,現在的URL是localhost:3000/user/login

我的問題是什麼?

+0

這是*全部*您的代碼? – timothyclifford

+0

請把你的問題文件放在:'./ routes/index'中也放了整個文件,而不是它的一部分,因爲可能會有一些其他問題導致它發生。 – num8er

+0

@timothyclifford – CharlesMoone

回答

0

據我瞭解,app.use('/', ...)將匹配所有請求,這就是爲什麼你check方法被調用的所有請求。

More good info here.

從高速文檔:

的路線將匹配與 「/」緊隨其路徑的任何路徑。

例如: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將執行所有請求,但只有重定向如果請求會話falsey和請求路徑不符/user/login

記住如果沒有設置req.session,您的代碼將失敗...

+0

:D,所以它不像REX匹配,''/ user''will匹配''/''和''/ user'',對吧? 似乎沒有靈活性.....但呃...無論 – CharlesMoone

+0

正確。我似乎很少有人建議使用'app.all'代替... – timothyclifford

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; 
+0

我有想法解決它,但我想知道結果。如果我將'app.use('/',index)'更改爲'app.use('/ index',index)',那麼也改變''router.get('/',(...)=' > {...})''到'router.get('/ index',(...)=> {...})' 我要求'localhost:3000/index',它會改變爲'本地主機:3000 /用戶/登錄'沒有'重定向太多' 所以我想知道爲什麼'/'它會告訴我'重定向太多' – CharlesMoone

+0

非常感謝你!這將是有益的! – CharlesMoone