Express 似乎忽略了根路由的控制器
Express appears to be ignoring controller for root route
我正在尝试将我网站上的所有 GET
请求(API 请求除外)发送到控制器,该控制器会在显示页面之前检查是否存在登录用户。否则,如果当前未登录,用户将转到登录页面。
下面的结构适用于除根路由 ('/'
) 之外的所有内容。例如,如果我尝试以未登录用户的身份点击 /admin
或 /games
,我将被正确地发送到登录页面。同样,如果我在每个页面中都正确显示(注意:我正在使用 AngularJS 客户端)。我遇到的一个问题是,当我访问我的根路由时,应用程序会尝试显示 index.html
,而不会检查用户是否已登录。我很困惑为什么该路由的处理方式不同,以及为什么我的 pagesController
似乎从未为此路由调用过。我已经完成了一些 'console logging' 并确认每个非 API 路由都会调用 pagesController.index
但 '/'
.
routes.js
'use strict';
var controllers = require('./controllers');
var v1Router = require('./routes/api/v1');
var pagesController = controllers.pagesController;
module.exports = function(app) {
app.use('/api', v1Router);
app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
app.get(['*'],
pagesController.index
);
};
pages.js
'use strict';
var path = require('path');
var index = function(req, res) {
if (req.user) {
res.sendFile(path.join(__dirname, '../assets', 'index.html'));
} else {
res.sendFile(path.join(__dirname, '../assets', 'signin.html'));
}
};
module.exports = {
index: index
};
更新:我在客户端路由中将根目录从 /
更改为 /a
,一切正常。无论出于何种原因 /
都不是 运行 通过 pagesController.index
.
更新 2:所以我 app.js
中的这一行导致了问题:
app.use(express.static(path.join(__dirname, 'assets')));
删除该行后 pagesController.index
可在 /
上正确调用,但是我的静态资产中的 none 已提供,因此简单地删除该行并不能解决问题。如何在忽略 index.html
的情况下正确提供我的静态资产?
您还可以在条件语句中处理路由:
'use strict';
var path = require('path');
var index = function(req, res) {
if (req.user) {
res.sendFile(path.join(__dirname, '../assets', 'index.html'));
} if (req.url === '/') {
** Handle Case Here **
}
else {
res.sendFile(path.join(__dirname, '../assets', 'signin.html'));
}
};
module.exports = {
index: index
};
好的,我做了一些研究:这里有一篇很棒的文章和可能的解决方案:(不确定它是否适合您的用例)
http://evanhahn.com/express-dot-static-deep-dive/
app.use(express.static(myStaticPath, {
index: ['jokes.txt', 'index.html']
})
您可以简单地给出一个文件数组作为索引,如果找到第一个,则提供,如果没有,则提供第二个,依此类推。
我正在尝试将我网站上的所有 GET
请求(API 请求除外)发送到控制器,该控制器会在显示页面之前检查是否存在登录用户。否则,如果当前未登录,用户将转到登录页面。
下面的结构适用于除根路由 ('/'
) 之外的所有内容。例如,如果我尝试以未登录用户的身份点击 /admin
或 /games
,我将被正确地发送到登录页面。同样,如果我在每个页面中都正确显示(注意:我正在使用 AngularJS 客户端)。我遇到的一个问题是,当我访问我的根路由时,应用程序会尝试显示 index.html
,而不会检查用户是否已登录。我很困惑为什么该路由的处理方式不同,以及为什么我的 pagesController
似乎从未为此路由调用过。我已经完成了一些 'console logging' 并确认每个非 API 路由都会调用 pagesController.index
但 '/'
.
routes.js
'use strict';
var controllers = require('./controllers');
var v1Router = require('./routes/api/v1');
var pagesController = controllers.pagesController;
module.exports = function(app) {
app.use('/api', v1Router);
app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
app.get(['*'],
pagesController.index
);
};
pages.js
'use strict';
var path = require('path');
var index = function(req, res) {
if (req.user) {
res.sendFile(path.join(__dirname, '../assets', 'index.html'));
} else {
res.sendFile(path.join(__dirname, '../assets', 'signin.html'));
}
};
module.exports = {
index: index
};
更新:我在客户端路由中将根目录从 /
更改为 /a
,一切正常。无论出于何种原因 /
都不是 运行 通过 pagesController.index
.
更新 2:所以我 app.js
中的这一行导致了问题:
app.use(express.static(path.join(__dirname, 'assets')));
删除该行后 pagesController.index
可在 /
上正确调用,但是我的静态资产中的 none 已提供,因此简单地删除该行并不能解决问题。如何在忽略 index.html
的情况下正确提供我的静态资产?
您还可以在条件语句中处理路由:
'use strict';
var path = require('path');
var index = function(req, res) {
if (req.user) {
res.sendFile(path.join(__dirname, '../assets', 'index.html'));
} if (req.url === '/') {
** Handle Case Here **
}
else {
res.sendFile(path.join(__dirname, '../assets', 'signin.html'));
}
};
module.exports = {
index: index
};
好的,我做了一些研究:这里有一篇很棒的文章和可能的解决方案:(不确定它是否适合您的用例)
http://evanhahn.com/express-dot-static-deep-dive/
app.use(express.static(myStaticPath, {
index: ['jokes.txt', 'index.html']
})
您可以简单地给出一个文件数组作为索引,如果找到第一个,则提供,如果没有,则提供第二个,依此类推。