让ExpressJS为映射路径返回404

时间:2013-10-06 10:05:06

标签: node.js express

所以我的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路径加载文件并且它不存在,那么它正在加载index-dev.html我希望404错误。有没有办法修改:

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

因此,如果路径不是静态路径之一,它将为已设置的静态路径返回404,但无法找到该文件并返回index-dev.html?

2 个答案:

答案 0 :(得分:3)

如果您在/components中查询不存在的文件,Express将继续在路径链中进行匹配。你只需要添加:

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

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

答案 1 :(得分:0)

您可以修改它以防止在请求用于静态文件时提供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");
});

这样,对于以index-dev.html/components/开头的路径,它不会为/app/提供服务。 对于这些路径,请求将被传递给下一个处理程序,并且由于找不到任何路径,因此将生成404