Express似乎忽略了根路由的控制器

时间:2015-10-17 11:36:07

标签: javascript node.js express url-routing

我正在尝试将我网站上的所有GET个请求(API请求除外)发送到控制器,该控制器会在显示该页面之前检查是否存在已登录的用户。否则,如果当前未登录,则会将用户发送到登录页面。

以下结构适用于除根路径('/')之外的所有内容。例如,如果我尝试将/admin/games作为非登录用户点击,则会将其正确发送到登录页面。同样,如果我在每个页面中都签名正确显示(注意:我正在使用AngularJS客户端)。我遇到的一个问题是,当我点击我的根路径时,应用会尝试显示index.html,而不会检查用户是否已登录。我很困惑为什么该路由的处理方式不同,为什么我的{似乎永远不会为此路线调用{1}}。我已经完成了一些“控制台日志记录”,并确认每个非API路由都会调用pagesController,但pagesController.index

routes.js

'/'

pages.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
  );
};

更新:我在客户端路由中将我的根目录从'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未通过/

更新2:因此pagesController.index中的这一行导致了问题:

app.js

删除该行app.use(express.static(path.join(__dirname, 'assets'))); 已在pagesController.index上正确调用,但我的静态资源都没有提供,因此只需删除该行就无法解决问题。如何在忽略/的情况下正确提供静态资产?

1 个答案:

答案 0 :(得分:1)

您还可以在条件语句中处理路线:

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

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