当我使用
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
答案 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将提供具有此名称的文件。