13

/about/contact/homeおよび/lessonsルートが定義された単純な Web ページがあります。を除いて、すべてのルートは正常に機能し/lessonsます。すぐにリダイレクト ループが発生します ( 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-inspectorたが、アプリがどのapp.gets にも一致しないように見えるため、役に立ちません。アクセスしようとすると、すぐにエラーが表示されますlocalhost:8888/lessons

編集:

問題の根本を見つけたと思います:

  • 私の/publicディレクトリにはlessonsフォルダがあります
  • 私の/viewsディレクトリにはlessons.ejsビューがあります

たとえば、に変更/public/lessonsすると、問題は解決します。/public/lessons11元のシナリオでリダイレクト ループを引き起こすエクスプレス フローとは何かを説明してもらえますか? また、それを解決するにはどうすればよいですか?

ありがとう

4

2 に答える 2

17

これが起こります:

  • のリクエスト/lessonsが入ります。
  • 静的ミドルウェアはpublic/lessonsフォルダーを認識し、それが目的のターゲットであると想定します。これはフォルダーであるため、リダイレクトが生成されます/lessons/(以下を参照)。
  • 静的ミドルウェアはその要求を再び取得index.htmlしますが、そのフォルダーに何もないことに気づき、次のミドルウェアに渡します ( connect-slashes)。
  • connect-slashesミドルウェアは末尾のスラッシュを削除し、へのリダイレクトを発行します/lessons
  • ループ全体が再び開始されます。

静的ミドルウェアが末尾にスラッシュを追加するのを防ぐことができます。これにより、リダイレクト ループが修正されると思います。

app.use(express.static(__dirname + '/public', { redirect : false }));
于 2013-03-17T07:35:18.590 に答える