我有一个基本的Node.js应用程序,我试图使用Express框架启动。我有一个views文件夹,其中有一个index.html文件。但是我在加载网页时收到以下错误:

Error: Cannot find module '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')

我错过了什么?


当前回答

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

index.js
css/
    reset.css
html/
    index.html

这段代码为/请求服务index.html,为/css/reset.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);

其他回答

这些答案很多都已经过时了。

使用快捷3.0.0和3.1.0,以下工作:

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);

请参阅下面的注释,了解表达式3.4+的替代语法和注意事项:

app.set('view engine', 'ejs');

然后你可以这样做:

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

这里假设views子文件夹中有视图,并且已经安装了ejs节点模块。如果不是,在Node控制台中执行以下命令:

npm install ejs --save

如果你使用express@~3.0.0修改下面的代码行:

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

就像这样:

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

我做了它的描述在express 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')

在Express 4.0.0中,你唯一要做的就是注释掉app.js中的两行:

/* app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); */ //or whatever the templating engine is.

然后将静态文件放到/public目录中。例如:/公共/ index . html

尝试Express routes中的res.sendFile()函数。

var express = require("express");
var app     = express();
var path    = require("path");


app.get('/',function(req,res){
  res.sendFile(path.join(__dirname+'/index.html'));
  //__dirname : It will resolve to your project folder.
});

app.get('/about',function(req,res){
  res.sendFile(path.join(__dirname+'/about.html'));
});

app.get('/sitemap',function(req,res){
  res.sendFile(path.join(__dirname+'/sitemap.html'));
});

app.listen(3000);

console.log("Running at Port 3000");

阅读此处:http://codeforgeek.com/2015/01/render-html-file-expressjs/

我想允许对“/”的请求由Express路由处理,而以前它们是由静态中间件处理的。这将允许我渲染index.html的常规版本或加载连接+最小化JS和CSS的版本,这取决于应用程序设置。受到Andrew Homeyer回答的启发,我决定将我的HTML文件(未修改)拖到views文件夹中,并像这样配置Express

   app.engine('html', swig.renderFile);
   app.set('view engine', 'html');
   app.set('views', __dirname + '/views');  

创建了一个这样的路由处理器

 app.route('/')
        .get(function(req, res){
            if(config.useConcatendatedFiles){
                return res.render('index-dist');
            }
            res.render('index');       
        });

结果很好。