用节点express.jsredirect循环

我有简单的网页与/about/contact/home/lessons路线定义。 除了/lessons所有路线都可以工作。 我马上得到一个redirect循环( Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects )。

这是我的主server.js代码:

 var port = process.env.PORT || 8888; var app = require('./app').init(port); var markdown = require('./markdown'); var lessons = require('./lessons.json').lessons; // app.use(function(req,res,next) { // console.log('adding lessons to locals'); // res.locals.date = new Date().toLocaleDateString(); // res.locals.lessons = lessons; // next(); // }); // app.use(app.router); app.get('/', function (req, res) { console.log('controller is : home'); res.locals.controller = 'home'; res.render('home'); }); app.get('/:controller', function (req, res, next) { var controller = req.params.controller; console.log('controller is : '+ controller); if (controller == 'about' || controller == 'contact') { res.locals.controller = controller; res.render(controller); } else { console.log('next was taken!'); next(); } }); app.get('/lessons', function(req, res) { res.locals.lessons = lessons; console.log('controller is : lessons'); res.render('lessons'); }); app.get('/lessons/:lesson', function(req, res) { console.log('controller is : lesson'); res.locals.controller = 'lessons'; res.send('gimmie the lesson'); }); /* The 404 Route (ALWAYS Keep this as the last route) */ app.get('/*', function (req, res) { console.log('got 404 request to ' + req.url); res.render('404'); }); 

这里是用于服务器初始化的app.js文件:

 var express = require('express'); var slashes = require('connect-slashes'); exports.init = function (port) { var app = express(); app.use(express.static(__dirname + '/public')); // add middleware to remove trailing slash in urls app.use(slashes(false)); app.set('views', __dirname + '/views') app.set('view engine', 'ejs'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.logger()); app.enable("jsonp callback"); if ('development' == app.get('env')) { app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); app.use(express.logger({ format: ':method :url' })); } if ('production' == app.get('env')) { app.use(express.errorHandler()); } app.use(function (err, req, res, next) { console.log('Oops, something went wrong'); res.render('500.ejs', { locals: { error: err }, status: 500 }); }); app.listen(port); console.log("Listening on port %d in %s mode", port, app.settings.env); return app; } 

我已经尝试用node-inspectordebugging应用程序,但它没用,因为应用程序似乎没有进入任何app.get来尝试匹配。 当我尝试访问localhost:8888/lessons时,它会不经意地给我提供错误

编辑:

我想我已经find了问题的根源:

  • 我的/public目录有一个lessons文件夹
  • 我的/views目录有一个lessons.ejs视图

例如,当我改变/public/lessons /public/lessons11 ,问题就解决了。 有人可以向我解释什么是在原来的情况下,导致redirect循环快递stream? 另外,我能做些什么来解决呢?

谢谢

有时候是这样的:

  • 请求/lessons进来;
  • 静态中间件看到public/lessons文件夹,并假定这是预期的目标是什么; 因为它是一个文件夹,它会生成一个redirect到/lessons/ (见下文)。
  • 静态中间件再次提取请求,但是注意到该文件夹​​中没有index.html ,并将其交给下一个中间件( connect-slashes )。
  • connect-slashes中间件删除尾部斜线并发出redirect到/lessons ;
  • 整个循环再次开始;

你可以防止静态中间件添加一个尾部的斜线,这将解决你的redirect循环,我认为:

 app.use(express.static(__dirname + '/public', { redirect : false }));