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']
})

您可以简单地给出一个文件数组作为索引,如果找到第一个,则提供,如果没有,则提供第二个,依此类推。