3

所以我的 ExpressJS 应用程序有以下开发配置:

//core libraries
var express = require('express');
var http = require('http');
var path = require('path');
var connect = require('connect');
var app = express();

//this route will serve as the data API (whether it is the API itself or a proxy to one)
var api = require('./routes/api');

//express configuration
app.set('port', process.env.PORT || 3000);

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.errorHandler({
  dumpExceptions: true, showStack: true
}));
app.use(connect.compress());

//setup url mappings
app.use('/components', express.static(__dirname + '/components'));
app.use('/app', express.static(__dirname + '/app'));

app.use(app.router);

require('./api-setup.js').setup(app, api);

app.get('*', function(req, res) {
  res.sendfile("index-dev.html");
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

现在您可以看到我正在做app.use('/components', express.static(__dirname + '/components'));但是如果我尝试使用 /components 路径加载一个文件并且它不存在,它正在加载我想要 404 错误的 index-dev.html。有没有办法修改:

app.get('*', function(req, res) {
  res.sendfile("index-dev.html");
});

这样它将为已设置但找不到文件的静态路径返回 404,如果路径不是静态路径之一,则返回 index-dev.html?

4

2 回答 2

4

如果查询一个/components不存在的文件,Express 会在路由链中继续匹配。你只需要添加这个:

app.get('/components/*', function (req, res) {
  res.send(404);
});

只有对不存在的静态文件的请求才会匹配此路由。

于 2013-10-06T10:18:10.570 回答
1

您可以修改它以防止index-dev.html在请求针对静态文件时提供服务:

app.get('*', function(req, res, next) {
  // if path begins with /app/ or /components/ do not serve index-dev.html
  if (/^\/(components|app)\//.test(req.url)) return next();
  res.sendfile("index-dev.html");
});

这样它就不会用于以orindex-dev.html开头的路径。对于这些路径,请求将被传递到下一个处理程序,并且由于找不到任何路径,它将导致./components//app/404

于 2013-10-06T10:24:24.097 回答