使用`index.html`而不是`index.ejs`

时间:2017-05-14 05:28:37

标签: node.js express mean-stack ejs viewengine

我有一个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.htmlviews/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
});

真是令人困惑......

3 个答案:

答案 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.htmlviews/index.htmlroot中的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中有记录。

这是每家互联网公司的常见做法。