所以我的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?
答案 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
。