我有一个mean-stack
申请。转到https://localhost:3000/#/home
,会显示views/index.ejs
。以下是app.js
中的设置:
var app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'public')));
app.all('/*', function(req, res, next) {
res.sendFile('index.ejs', { root: __dirname });
});
实际上,我不会在ejs
中使用index.ejs
的功能。所以现在我只想使用index.html
而不是index.ejs
。
我将index.ejs
的内容放在public/htmls/index.html
和views/index.html
中。以下是app.js
中的当前设置:
var app = express();
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'public')));
app.all('/*', function(req, res, next) {
res.sendFile('index.html', { root: __dirname });
// res.sendFile('index.html'); // does not work either
});
但是,运行https://localhost:3000/#/home
会返回
Error: No default engine was specified and no extension was provided.
有谁知道如何修复它?
修改1:,按照user818510
的回答,我在res.sendFile('index.html', { root: path.join(__dirname, 'views') });
中尝试了app.js
,但仍找不到index.html
。< / p>
然而,在routes/index.js
中,以下内容可以找到index.html
,但会发出警告express deprecated res.sendfile: Use res.sendFile instead routes/index.js:460:9
。
var express = require('express');
var router = express.Router();
var path = require('path');
... ...
router.get('*', function(req, res) {
res.sendfile('./views/index.html'); // works, but a deprecation warning
// res.sendFile('index.html', { root: path.join(__dirname, 'views') }); does not work
});
真是令人困惑......
答案 0 :(得分:1)
如果它是单页平均应用程序,那么您只需要使用 static 启动 express 并将index.html
放入static/
导演:
项目布局
static/
index.html
server.js
<强> server.js 强>
'use strict';
var express = require('express');
var app = express();
app.use(express.static('public'));
var server = app.listen(8888, function () {
console.log("Server started. Listening on port %s", server.address().port);
});
现在您可以致电http://localhost:8888/#home
答案 1 :(得分:0)
看起来路径有问题。您的index.html
位于public/htmls/index.html
和views/index.html
。 root
中的res.sendFile
选项应为__dirname
+ /public/htmls/
或__dirname
+ /views
在您的代码中,您使用的是路径:
res.sendFile('index.html', { root: __dirname });
您的app.js
将位于项目根目录中,您的public
目录位于同一级别。根据{{1}}中的root
选项,您必须将res.sendFile
置于与index.html
相同的级别。
您应该更改res.sendFile中的根路径。使用:
app.js
OR
res.sendFile('index.html', { root: path.join(__dirname, 'public', 'htmls') });
上述res.sendFile('index.html', { root: path.join(__dirname, 'views') });
基于您在问题中提到的路径。
这是指向文档的链接: http://expressjs.com/en/api.html#res.sendFile
您的无默认引擎错误可能是因为您已将您将视图引擎设置为ejs但仍具有现有ejs视图的行进行了注释。使用根路径更改取消注释该行应该可以解决您的问题。
答案 2 :(得分:-2)
不要从应用程序服务器提供静态内容。
为此使用网络服务器,并在生产中使用像Akamai这样的内容分发网络。
内容分发网络将按带宽向您收费(例如:每TB太10美分)。在Akamai中相当于10美分,使用云实例可能会花费数千美元。
除此之外,您的服务器将有不必要的负载。
如果您必须从应用程序服务器提供静态内容,请在服务器前放置反向代理缓存,如nginx,varnish或squid。但这仍然是非常低成本的。这在express website中有记录。
这是每家互联网公司的常见做法。