渲染基本的HTML视图?

ahe*_*ick 272 html javascript mongodb node.js express

我有一个基本的node.js应用程序,我试图使用Express框架开始.我有一个views文件夹,我有一个index.html文件.但是在加载Web浏览器时收到以下错误.

错误:找不到模块'html'

以下是我的代码.

var express = require('express');
var app = express.createServer();

app.use(express.staticProvider(__dirname + '/public'));

app.get('/', function(req, res) {
    res.render('index.html');
});

app.listen(8080, '127.0.0.1')
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

And*_*yer 291

你可以让jade包含一个纯HTML页面:

在views/index.jade中

include plain.html
Run Code Online (Sandbox Code Playgroud)

在views/plain.html中

<!DOCTYPE html>
...
Run Code Online (Sandbox Code Playgroud)

和app.js仍然可以只渲染玉:

res.render(index)
Run Code Online (Sandbox Code Playgroud)

  • 你不应该只为初始测试快递而不用玉石模板渲染那个html页面吗? (6认同)
  • 更多的是hack,而不是解决方案。 (3认同)
  • 请注意,我想要的只是提供一个 .html 文件,因为我的应用程序是单页的;) (2认同)

Dre*_*kes 222

其中许多答案都已过时.

使用express 3.0.0和3.1.0,以下工作:

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);
Run Code Online (Sandbox Code Playgroud)

有关Express 3.4+的替代语法和注意事项,请参阅以下注释:

app.set('view engine', 'ejs');
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

app.get('/about', function (req, res)
{
    res.render('about.html');
});
Run Code Online (Sandbox Code Playgroud)

这假设您在views子文件夹中拥有视图,并且已安装ejs节点模块.如果没有,请在节点控制台上运行以下命令:

npm install ejs --save
Run Code Online (Sandbox Code Playgroud)

  • 为什么你需要ejs? (8认同)
  • 使用Express 3.4.2:app.set('view engine','ejs'); (6认同)
  • 您应该使用命令'npm install ejs --save'来更新package.json (3认同)

Ivo*_*zel 71

从Express.js指南:查看渲染

查看文件名采用表单Express.ENGINE,其中ENGINE是所需模块的名称.例如,视图layout.ejs会告诉视图系统require('ejs'),模块被装载必须导出方法exports.render(str, options)符合快递,但是app.register()可以用来映射引擎文件扩展名,从而例如foo.html可以通过玉石来呈现.

所以你要么创建自己的简单渲染器,要么只使用jade:

 app.register('.html', require('jade'));
Run Code Online (Sandbox Code Playgroud)

更多关于app.register.

请注意,在Express 3中,此方法已重命名 app.engine

  • 注意 - app.register已在Express 3中重命名为app.engine. (57认同)
  • 请参阅Andrew Homeyer的回答.这是实际的答案. (8认同)
  • 从其他答案来看,对于Express 4,我最终使用了'app.engine('.html',require('ejs').renderFile);` (7认同)

kee*_*n3d 45

您还可以阅读HTML文件并发送它:

app.get('/', (req, res) => {
    fs.readFile(__dirname + '/public/index.html', 'utf8', (err, text) => {
        res.send(text);
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案很糟糕,因为没有缓存文件; 每个请求都会读取它. (23认同)
  • 让人惊讶.这违背了面向会议的简化架构(如MVC)的全部要点. (5认同)
  • 手动缓存它可能很容易。只需将读取的文件存储一个变量,如果该变量为空,则只能再次读取。您还可以使用 JS 对象并将各种文件存储在各种变量中,并带有时间戳。当然它比大多数人做的工作要多,但是对于刚接触 node 的人来说很好。很容易理解 (2认同)

小智 45

试试这个.这个对我有用.

app.configure(function(){

  .....

  // disable layout
  app.set("view options", {layout: false});

  // make a custom html template
  app.register('.html', {
    compile: function(str, options){
      return function(locals){
        return str;
      };
    }
  });
});

....

app.get('/', function(req, res){
  res.render("index.html");
});
Run Code Online (Sandbox Code Playgroud)

  • 这有点奇怪......你应该将html作为静态文件提供.这也为您提供了更好的缓存的好处.创建自定义"html编译器"似乎是错误的.如果您需要从路径中发送文件(您很少需要这样做),只需阅读并发送即可.否则只需重定向到静态html. (8认同)
  • 我在`app.register`上看到一个错误.也许它已经在快递3.0.0.rc3中被弃用了?`TypeError:对象函数app(req,res){app.handle(req,res); 没有方法'注册' (3认同)
  • 上面的确切配置有问题,所以我从".html"中删除了点并添加了这个:app.set('view engine','html'); app.set('views',__ dirname +'/ views'); 完美的渲染 (2认同)
  • @Enyo这个评论看起来很奇怪,考虑如何做你所说的应该做的问题是问题,你的答案就是做到这一点.你如何通过缓存提供静态html? (2认同)

小智 20

app.get('/', function (req, res) {
res.sendfile(__dirname + '/public/index.html');
});
Run Code Online (Sandbox Code Playgroud)

  • sendfile不是生产模式下的缓存,因此这不是一个好的解决方案. (5认同)
  • @SeymourCakes 如果我错了,请纠正我,但我认为 sendFile 现在支持缓存:http://devdocs.io/express/index#res.sendFile (2认同)

小智 19

如果您使用express@~3.0.0,请更改以下示例中的行:

app.use(express.staticProvider(__dirname + '/public'));
Run Code Online (Sandbox Code Playgroud)

这样的事情:

app.set("view options", {layout: false});
app.use(express.static(__dirname + '/public'));
Run Code Online (Sandbox Code Playgroud)

我按照快速api页面的描述制作它,它就像魅力一样.使用该设置,您无需编写其他代码,因此可以轻松地用于微型生产或测试.

完整代码如下:

var express = require('express');
var app = express.createServer();

app.set("view options", {layout: false});
app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res) {
    res.render('index.html');
});

app.listen(8080, '127.0.0.1')
Run Code Online (Sandbox Code Playgroud)

  • 什么是服务html页面的差异为静态与仅加载非静态与快递? (2认同)

Jak*_*Jak 14

我也面临着同样的问题express 3.Xnode 0.6.16.上述解决方案不适用于最新版本express 3.x.他们删除了app.register方法并添加了app.engine方法.如果您尝试了上述解决方案,则可能会出现以下错误.

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'register'
    at Function.<anonymous> (/home/user1/ArunKumar/firstExpress/app.js:37:5)
    at Function.configure (/home/user1/ArunKumar/firstExpress/node_modules/express/lib/application.js:399:61)
    at Object.<anonymous> (/home/user1/ArunKumar/firstExpress/app.js:22:5)
    at Module._compile (module.js:441:26)
    at Object..js (module.js:459:10)
    at Module.load (module.js:348:31)
    at Function._load (module.js:308:12)
    at Array.0 (module.js:479:10)
    at EventEmitter._tickCallback (node.js:192:40)
Run Code Online (Sandbox Code Playgroud)

摆脱错误信息.将以下行添加到您的app.configure function

app.engine('html', require('ejs').renderFile);
Run Code Online (Sandbox Code Playgroud)

注意:您必须安装ejs模板引擎

npm install -g ejs
Run Code Online (Sandbox Code Playgroud)

例:

app.configure(function(){

  .....

  // disable layout
  app.set("view options", {layout: false});

  app.engine('html', require('ejs').renderFile);

....

app.get('/', function(req, res){
  res.render("index.html");
});
Run Code Online (Sandbox Code Playgroud)

注意:最简单的解决方案是使用ejs模板作为视图引擎.在那里,您可以在*.ejs视图文件中编写原始HTML.

  • 你必须在全球安装`ejs`吗? (2认同)

KAR*_*N.A 9

文件夹结构:

.
??? index.html
??? node_modules
?   ???{...}
??? server.js
Run Code Online (Sandbox Code Playgroud)

server.js

var express = require('express');
var app = express();

app.use(express.static('./'));

app.get('/', function(req, res) {
    res.render('index.html');
});

app.listen(8882, '127.0.0.1')
Run Code Online (Sandbox Code Playgroud)

的index.html

<!DOCTYPE html>
<html>
<body>

<div> hello world </div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

输出:

你好,世界


小智 7

如果您不必使用views目录,只需将html文件移动到下面的公共目录即可.

然后,将此行添加到app.configure而不是'/ views'.

server.use(express.static(__dirname + '/public'));


Zna*_*kus 6

对于我的项目,我创建了这个结构:

index.js
css/
    reset.css
html/
    index.html
Run Code Online (Sandbox Code Playgroud)

此代码为/请求提供 index.html,为请求提供reset.css /css/reset.css。足够简单,最好的部分是它会自动添加缓存标头

var express = require('express'),
    server = express();

server.configure(function () {
    server.use('/css', express.static(__dirname + '/css'));
    server.use(express.static(__dirname + '/html'));
});

server.listen(1337);
Run Code Online (Sandbox Code Playgroud)


Tro*_*jan 5

要在节点中呈现Html页面,请尝试以下操作:

app.set('views', __dirname + '/views');

app.engine('html', require('ejs').renderFile);
Run Code Online (Sandbox Code Playgroud)


小智 5

如果你想渲染 HTML 文件,你可以使用sendFile()method 而不使用任何模板引擎

const express =  require("express")
const path = require("path")
const app = express()
app.get("/",(req,res)=>{
    res.sendFile(**path.join(__dirname, 'htmlfiles\\index.html')**)
})
app.listen(8000,()=>{
    console.log("server is running at Port 8000");
})
Run Code Online (Sandbox Code Playgroud)

我在htmlfile 中有一个 HTML 文件,所以我使用路径模块来呈现 index.html 路径是节点中的默认模块。如果您的文件存在于刚刚使用的根文件夹中

res.sendFile(path.join(__dirname, 'htmlfiles\\index.html'))
Run Code Online (Sandbox Code Playgroud)

在里面app.get()它会工作