2013-03-17 8 views
9

मेरे पास /about, /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 एस में से किसी एक में जाना प्रतीत नहीं होता है। यह तुरंत मुझे त्रुटि देता है जब मैं तक पहुँचने का प्रयास localhost:8888/lessons

संपादित करें:

मुझे लगता है कि मैं इस समस्या की जड़ पाया है:

  • मेरे /public dir एक lessons फ़ोल्डर है
  • मेरा /views डीआईआर 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

ग्रेट स्पष्टीकरण! '{रीडायरेक्ट: झूठी} 'जोड़कर वास्तव में मदद मिली। क्या आपको लगता है कि तथ्य यह है कि मैंने स्थिर रीडायरेक्ट को अक्षम कर दिया है भविष्य में समस्याएं पैदा कर सकती हैं? मैं, इसके बजाय, सभी स्थैतिक फ़ाइलों को 'स्थिर 'उपसर्ग पर कॉल कर सकता हूं:' app.use ('/static ', express।स्थैतिक (__ dirname + '/ public')); 'आप क्या विकल्प मानते हैं बेहतर है? – Michael

+1

जब कोई निर्देशिका नाम का अनुरोध करता है तो क्या आपको कभी भी 'index.html' की सेवा करने की क्षमता की आवश्यकता होगी? यदि नहीं, तो मुझे नहीं लगता कि आप समस्याओं में भाग लेंगे। – robertklep

+1

(हालांकि अपने स्वयं के उपसर्ग के तहत स्थैतिक संसाधन बढ़ाना एक क्लीनर समाधान है) – robertklep

1

आप express-redirect-loop मिडलवेयर उपयोग करने का प्रयास कर सकते हैं। यह सत्र का उपयोग करता है और आप इसके बारे में अधिक पढ़ सकते हैं और इसे https://github.com/niftylettuce/express-redirect-loop पर कार्यान्वित कर सकते हैं।

संबंधित मुद्दे