express.js:改变路由器和静态的顺序会对静态文件产生404错误

时间:2013-11-30 08:19:11

标签: static express router

当我使用

app.use(express.cookieParser());
app.set('views', path.join(__dirname, 'views'));
app.engine('html', consolidate.underscore);
app.set('view engine', 'html');
app.use(express.favicon(path.join(__dirname, 'public/favicon.ico')));
app.use(express.logger('dev'));

app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);
require('./routes/index_roote')(app);

以下是./routes/index_roote中的路线:

module.exports = function(app) {
  app.get('/', function(req, res) {
    res.render('index');
  });
  app.post('/', function(req, res) {
    res.end('Ok');
  });
};

我的观点是简单的html文件作为下划线模板。 如果我在静态之前设置 app.router (如在自动生成的应用中那样)

app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
require('./routes/index_roote')(app);

我尝试获取脚本,样式和图片等静态资源时收到 404 。为什么呢?

这里是index_roote模块代码:

module.exports = function(app) {
    app.get('/', function(req, res){
      res.render('index');
    });

    app.post('/', function(req, res){
      res.end('Ok');
    });
};

index.html 位于vews文件夹

其他静态文件在 -public
--images
--scripts
--styles

1 个答案:

答案 0 :(得分:1)

app.use()接受快速中间件作为输入并将其添加到中间件堆栈。每个中间件都有一个函数next(),它作为回调执行堆栈中的下一个中间件。因此,使用app.use()添加中间件的顺序很重要,因为这将是中间件堆栈的顺序。

app.router是负责处理路由的中间件,就像您使用app.get()定义的那样。实际上,即使您没有将app.get()显式添加到中间件堆栈,app.router也会使用index.html;它将在定义路线时添加它。当使用路由和静态文件服务时,首先明确使用路由器中间件被认为更安全,以避免路由被命名不佳的静态文件隐藏的情况。 Express会在自动生成应用程序文件时为您执行此操作。

根据您在此处显示的代码,您的public文件夹中有一个名为index.html的文件,您尝试使用下划线进行渲染。这里有几个问题。名称“index.html”在放入静态文件夹时会收到特殊处理。如果您的静态文件中间件是第一个,Express将通过提供app.router来处理root请求。这就是当您的静态文件中间件出现在app.router之前时,您的代码可以运行的原因。 请注意,index.html未呈现。

app.get()出现时,index.html会处理对root的请求,并且您正在尝试呈现app.render()。但是,views期望文件位于名为app.set('views', path.join(__dirname, 'public')); 的文件中。您可以通过执行以下操作来更改此行为:

app.set('views', path.join(__dirname, 'views'));

而不是你现在正在做的事情:

app.router

总结:

由于您的代码目前已编写,因此当public出现时,您会获得404,因为它会导致您使用“/”路由。您通过呈现位于错误文件夹(views而不是app.router)的文件来处理此路由。当index.html排在第二位时,您正在提供{{1}}(不提供),因为当您收到'/'请求时,Express将提供具有此名称的文件。