从Express 4提供静态html文件

时间:2014-12-18 13:36:42

标签: node.js express

我想使用express 4提供单个html页面。它曾用于以前版本的Express,但现在它告诉我“没有指定默认引擎且没有提供扩展”。非常感谢提前。

var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var app = express();
var router = express.Router();

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static( path.join(__dirname, 'public')));

router.get('/', function(req, res) {
    res.render('public/main.html');
});

module.exports = app;

下面的图书馆信息

"dependencies": {
    "express": "~4.9.0",
    "body-parser": "~1.8.1",
    "cookie-parser": "~1.3.3",
    "morgan": "~1.3.0",
    "serve-favicon": "~2.1.3",
    "debug": "~2.0.0",
    "jade": "~1.6.0"
  },

下面是使用Express 3的相同示例,它可以正常工作。

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

app.use(express.static(path.join(__dirname, 'public')));

app.get("/", function (req, res) {
    res.sendfile('public/main.html');
});

module.exports = app;

以下是从Express 4提供静态html的正确方法。感谢E_net4和NarendraSoni的答案(12)。要使它工作,你必须避免使用Express'路由器,即express.Router().get('/'),因为它将调用Express应用程序的模板引擎。

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

app.use(express.static( path.join(__dirname, 'public')));

app.get('/', function(req, res) {
    res.sendfile('public/main.html');
});

module.exports = app;

4 个答案:

答案 0 :(得分:3)

res.render将调用Express应用程序的模板引擎,但您尚未指定。

Express在响应对象中提供sendFile函数,允许您在不通过模板引擎的情况下发送静态页面文件。

var router = express.Router();

router.get('/', function(error, res) {
  var options = {root: __dirname};
  res.sendFile('something.txt', options, function(error) {
    if (error) {
      res.writeHead(500);
      res.end();
    }
  });
});

在你的代码中还有其他一些看起来很可疑的东西。您已创建路由器,但未显示应用程序中包含的位置。可能正在发生一些依赖模板引擎的其他中间件正在拦截请求。

app.use('/', router);

另请注意,在这种情况下您无需创建新路由器。应用程序的行为就像路由器一样。

答案 1 :(得分:2)

如果您只需要提供一个文件,可以用以下代码替换路由器:

var fs = require('fs');

router.get('/', function(req, res) {
    fs.readFile('public/main.html', function (err, html) {
         res.writeHeader(200, {"Content-Type": 'text/html'});
         res.write(html);
         res.end();
    });
});

答案 2 :(得分:2)

你做的一切都是正确的,只是有一个非常小的错误。 :)

将您的路线定义编辑为:

app.get('/', function(req, res) {
    res.sendFile('main.html');
});

现在你已经包括:

app.use(express.static(path.join(__dirname, 'public')));

因此您无需在 main.html 中添加公开

就是这样,享受,你的代码现在应该可以正常工作。

答案 3 :(得分:0)

从技术上讲,如果你只想提供静态html文件,你只需要这一行:

app.use(express.static( path.join(__dirname, 'public')));

意味着如果您从根目录获取GET /main.html,则无需再键入任何其他代码即可静态提供。

使用:

app.get('/', function(req, res) {
    res.sendFile('main.html');
});

您正在使用为快速应用程序的根目录而不是路由器()定义的路由,如明文中所述:

  

路由方法派生自其中一个HTTP方法,并附加到快速类的实例。

     

以下代码是为其定义的路由示例   获取应用程序根目录的方法。

    // GET method route
app.get('/', function (req, res) {
  res.send('GET request to the homepage');
});

所以这里发生的是你正在使用为express应用程序的根定义的路由,而不是为express.Router()定义的路由。

如果您想使用Router()以相同的方式路由事物,您可以尝试这样的代码:

//app.use(express.static(path.join(__dirname, 'public')));

var router = express.Router();

app.use('/', router);
/* GET home page. */
router.get('/', function(req, res) {
  res.sendFile(__dirname + '/path/to/file.html');
});

所以,你不必避免使用express.Router(),你只需要使用快递应用程序根目录中的路由,或者以明显不同的方式使用express.Router()的路由