Любой способ обслуживать статические html файлы из выражения без расширения?

Я хотел бы обслуживать html файл без указания его расширения. Есть ли способ сделать это без определения маршрута? Например, вместо

 /helloworld.html

Я хотел бы сделать только

 /helloworld

Ответ 1

Решение quick'n'dirty заключается в том, чтобы прикрепить .html к запросам, у которых нет периода в них и для которых существует HTML файл в общедоступном каталоге:

var fs        = require('fs');
var publicdir = __dirname + '/public';

app.use(function(req, res, next) {
  if (req.path.indexOf('.') === -1) {
    var file = publicdir + req.path + '.html';
    fs.exists(file, function(exists) {
      if (exists)
        req.url += '.html';
      next();
    });
  }
  else
    next();
});
app.use(express.static(publicdir));

Ответ 2

вы можете просто использовать опцию расширения в методе express.static.

app.use(express.static(path.join(__dirname, 'public'),{index:false,extensions:['html']}));

Ответ 3

В то время как ответ Роберта более элегантный, есть еще один способ сделать это. Я добавляю этот ответ только ради полноты. Чтобы обслуживать статические файлы без расширения, вы можете создать папку с именем маршрута, с которым хотите работать, а затем создать в нем файл index.html.

Принимая мой собственный пример, если я хотел бы служить hello.html в /hello. Я бы создал каталог под названием hello и поместил в него файл index.html. Теперь, когда '/hello' называется express, автоматически будет обслуживать этот файл без расширения.

Вид очевидный, поскольку это поддерживается всеми веб-фреймворками, но я пропустил его тогда.

Ответ 4

Если вы хотите сделать обратный путь, как я сделал (обслуживающий html файл под названием "helloworld" как html), это промежуточное программное обеспечение, которое я использовал.

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

app.use(function(req, res, next) {
  if (req.path.indexOf('.') === -1) {
    res.setHeader('Content-Type', 'text/html');
  }
  next();
});

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

app.listen(8080, function () {
  console.log('App listening on port 8080!');
})