gpt4 book ai didi

node.js - 使用 node express.js 重定向循环

转载 作者:IT老高 更新时间:2023-10-28 23:19:28 34 4
gpt4 key购买 nike

我有一个简单的网页,其中定义了 /about/contact/home/lessons 路由。除了 /lessons 之外,所有路线都可以正常工作。我立即得到一个重定向循环(Error 310 (net::ERR_TOO_MANY_REDIRECTS): There was 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.get 尝试匹配。当我尝试访问 localhost:8888/lessons

时,它立即给了我错误

编辑:

我想我找到了问题的根源:

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

例如,当我将 /public/lessons 更改为 /public/lessons11 时,问题就解决了。有人可以向我解释导致重定向循环的原始场景中的快速流是什么吗?还有,我能做些什么来解决它?

谢谢

最佳答案

发生这种情况:

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

您可以防止静态中间件添加尾部斜杠,我认为这将修复您的重定向循环:

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

关于node.js - 使用 node express.js 重定向循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458424/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com