【发布时间】:2014-02-13 19:50:38
【问题描述】:
我正在使用 Node.js、Express 和 AngularJS 开发一个网络应用程序。
我在 public 文件夹中提供我的前端 JavaScript,例如HTTP GET /lib/angular/angular.min.js 可能会返回 AngularJS JavaScript。
但是,由于我希望所有请求都由浏览器中的 Angular 路由器处理,因此我定义了一个包罗万象的路由,如下所示:
app.get('/*', function(req, res) { res.send('template.jade'); });
问题是此路由会覆盖静态资产路由,在这种情况下它始终运行,即使请求静态资产也是如此。
有没有办法告诉 Express 在自定义路由传播之前处理静态资产?有没有其他巧妙的方法可以避免这个问题?
Express配置如下:
// Generated by CoffeeScript 1.7.1
(function() {
var ExpressConfig, crypto, express, path, pkg;
crypto = require('crypto');
express = require('express');
path = require('path');
pkg = require('../package');
ExpressConfig = (function() {
function ExpressConfig() {}
ExpressConfig.prototype.configure = function(ENV) {
var APP_ROOT, app;
APP_ROOT = path.join(__dirname, '../');
app = express();
app.set('port', pkg.config.port);
app.set('views', APP_ROOT + 'webapp');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser(crypto.randomBytes(20).toString('hex')));
app.use(express.session());
app.use(app.router);
app.use(require('stylus').middleware(APP_ROOT + 'public'));
app.use(express["static"](APP_ROOT + 'public'));
if (ENV === 'development') {
app.use(express.errorHandler());
}
return app;
};
return ExpressConfig;
})();
module.exports = ExpressConfig;
}).call(this);
//# sourceMappingURL=express-config.map
我可以验证配置是否在包罗万象的路由定义之前运行,因为我已经通过登录每个地方检查顺序来检查它。
我还可以在删除 catch-all 路由时验证资产配置是否有效。
【问题讨论】:
-
确保声明静态中间件的行在之前这条路由。
-
Express 静态配置是在自定义路由定义之前运行。
-
能否贴出定义静态中间件的代码?
-
静态中间件必须在app.use(app.router)之前列出;
-
@HectorCorrea 谢谢!我什至没有注意那条线。如果您发布答案,我会接受。 :-)