2013-03-17 34 views
9

我有簡單的網頁與​​,/contact,/home/lessons定義的路由。除/lessons之外,所有路線都可以正常工作。我立即得到一個重定向循環(Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects)。重定向循環與節點express.js

這裏是我的主要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-inspector的應用程序,但因爲應用了也沒用似乎沒有進入任何app.get s試圖匹配。這immidiately給我的錯誤,當我嘗試訪問localhost:8888/lessons

編輯:

我想我已經找到了問題的根源:

  • /public DIR有lessons文件夾
  • 我的/views dir有一個lessons.ejs查看

當我改變/public/lessons/public/lessons11例如,問題得到解決。有人可以向我解釋原始情況下導致重定向循環的快遞流?另外,我能做些什麼來解決它?

感謝

回答

14

出現這種情況:

  • /lessons收到請求時;
  • 靜態中間件看到public/lessons文件夾,並假設這是預期目標是什麼;因爲它是一個文件夾,它會生成一個重定向到/lessons/(見下文);
  • 靜態中間件挑選一遍請求,但注意到有該文件夾中沒有index.html,並把它到下一個中​​間件(connect-slashes);
  • connect-slashes中間件移除結尾的斜線和發出重定向到/lessons;
  • 整個循環再次啓動;

可以防止靜電的中間件,將尾隨斜線,這將解決您的重定向循環我認爲:

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

很好的解釋!加入'{redirect:false}'的確有幫助。你認爲我禁用靜態重定向的事實可能會導致未來的問題?相反,我可以將所有靜態文件調用掛載到靜態前綴:app.use('/ static',express。靜態(__ dirname +'/ public')); '你認爲什麼選擇更好? – Michael 2013-03-17 07:51:44

+1

當有人請求目錄名時,你是否曾經需要能夠自動提供'index.html'的能力?如果沒有,我認爲你不會遇到問題。 – robertklep 2013-03-17 07:55:48

+1

(雖然在自己的前綴下安裝靜態資源是一個更清潔的解決方案) – robertklep 2013-03-17 08:01:53