渲染原始HTML

Ran*_*lue 26 javascript node.js express

我想.html使用Express 3 渲染原始页面,如下所示:

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

这就是我如何配置服务器来呈现原始HTML页面(灵感来自这个过时的问题):

server
    .set('view options', {layout: false})
    .set('views', './../')
    .engine('html', function(str, options) {
        return function(locals) {
             return str;
        };
    });
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用此配置页面会挂起并且永远不会正确呈现.我做错了什么?如何使用Express 3渲染原始HTLM而不使用Jade和EJS等花哨的渲染引擎?

sha*_*sh7 46

我想你想说的是:我如何提供静态html文件,对吧?

让我们来看看吧.

首先,我自己的项目中的一些代码:

app.configure(function() {
    app.use(express.static(__dirname + '/public'));
});
Run Code Online (Sandbox Code Playgroud)

这意味着我的app文件夹中有一个名为public的文件夹.我所有的静态内容,如css,js甚至html页面都在这里.

要实际发送静态html页面,只需将其添加到您的应用程序文件中即可

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

所以如果你有一个名为xyz.com的域名; 每当有人去那里,他们将在他们的浏览器中提供layout.html.

编辑

如果你使用快递4,事情会有所不同.路由和中间件的执行顺序与它们的顺序完全相同.

一种好的技术是将静态文件服务代码放在所有标准路由之后.像这样 :

// All standard routes are above here
app.post('/posts', handler.POST.getPosts);

// Serve static files
app.use(express.static('./public'));
Run Code Online (Sandbox Code Playgroud)

这非常重要,因为它可能会消除代码中的瓶颈.看看这个stackoverflow的答案(他谈到优化的第一个答案)

Express 4.0的另一个主要变化是你不需要使用app.configure()

  • 像魅力一样工作 - 在我的情况下,我使用相对路径并最终使用403如此使用:`res.sendfile(path.resolve('../ path/to/index.html'));; (2认同)

hun*_*tis 20

如果您实际上不需要将数据注入模板,则express中最简单的解决方案是使用静态文件服务器(express.static()).

但是,如果您仍然希望手动将路线连接到页面(例如,您的示例将'/'映射到'login.html'),您可能会尝试res.sendFile()发送您的html文档:

http://expressjs.com/api.html#res.sendfile

  • 为了记录,它是带有小写字母F的sendfile.很奇怪它不是驼峰式的,但它就是这样的. (2认同)

she*_*onk 18

你尝试过使用fs模块吗?

server.get('/', function(req, res) {
    fs.readFile('index.html', function(err, page) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(page);
        res.end();
    });
}
Run Code Online (Sandbox Code Playgroud)


tzt*_*txf 7

正如文档所说:'Express期望:app.engin(...)中的:(路径,选项,回调)'格式函数.

所以你可以像下面那样编写代码(为简单起见,但它可以工作):

server
.set('view options', {layout: false})
.set('views', './../')
.engine('html', function(path, options, cb) {
    fs.readFile(path, 'utf-8', cb);
});
Run Code Online (Sandbox Code Playgroud)

当然就像2#和3#所说的那样,你应该使用express.static()进行静态文件传输; 以上代码不适合生产


Jay*_*mar 6

首先,你所犯的错误是尝试使用express 2.x代码片段在express 3.0中呈现原始HTML.从表达3.0开始,只将文件路径传递给视图引擎而不是文件内容.

来解决方案,

创建一个简单的视图引擎

var fs = require('fs'); 

function rawHtmlViewEngine(filename, options, callback) {
    fs.readFile(filename, 'utf8', function(err, str){
        if(err) return callback(err);

        /*
         * if required, you could write your own 
         * custom view file processing logic here
         */

        callback(null, str);
    }); 
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它

server.engine('html', rawHtmlViewEngine)
server.set('views', './folder');
server.set('view engine', 'html');
Run Code Online (Sandbox Code Playgroud)


参考

官方快递2.x至3.x移民指南

请参阅此网址中的"模板引擎集成"部分 https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x