Статические файлы с помощью express.js

Я хочу использовать подкаталог index.html и /media как статические файлы. Файл индекса должен обслуживаться как на страницах /index.html, так и /.

У меня

web_server.use("/media", express.static(__dirname + '/media'));
web_server.use("/", express.static(__dirname));

но вторая строка, видимо, служит для всего __dirname, включая все файлы в нем (а не только index.html и media), которые мне не нужны.

Я также пробовал

web_server.use("/", express.static(__dirname + '/index.html'));

но доступ к базовому URL / затем приводит к запросу web_server/index.html/index.html (double index.html component), который, конечно, не выполняется.

Любые идеи?


Кстати, я не смог найти абсолютно никакой документации в Express по этой теме (static() + ее параметры)... разочаровывает. Также приветствуется ссылка на документ.

Ответ 1

express.static() ожидает, что первым параметром будет путь к каталогу, а не имя файла. Я бы предложил создать другой подкаталог, содержащий ваш index.html и использовать его.

Предоставление статических файлов в документацию Express или более подробную документацию по предоставлению serve-static, включая поведение по умолчанию при обслуживании index.html:

По умолчанию этот модуль отправляет файлы "index.html" в ответ на запрос к каталогу. Чтобы отключить этот набор false или предоставить новый индекс, передайте строку или массив в предпочтительном порядке.

Ответ 2

Если у вас есть эта настройка

/app
   /public/index.html
   /media

Тогда это должно получить то, что вы хотели

var express = require('express');
//var server = express.createServer();
// express.createServer()  is deprecated. 
var server = express(); // better instead
server.configure(function(){
  server.use('/media', express.static(__dirname + '/media'));
  server.use(express.static(__dirname + '/public'));
});

server.listen(3000);

Уловка оставляет эту строку в качестве последней резервной копии

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

Что касается документации, так как Express использует связующее ПО, мне было проще просто посмотреть исходный код подключения напрямую.

Например, эта строка показывает, что поддерживается index.html https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

Ответ 3

В новейшей версии выражения "createServer" устарел. Этот пример работает для меня:

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

//app.use(express.static(__dirname)); // Current directory is root
app.use(express.static(path.join(__dirname, 'public'))); //  "public" off of current is root

app.listen(80);
console.log('Listening on port 80');

Ответ 4

res.sendFile & express.static как будет работать для этого

var express = require('express');
var app = express();
var path = require('path');
var public = path.join(__dirname, 'public');

// viewed at http://localhost:8080
app.get('/', function(req, res) {
    res.sendFile(path.join(public, 'index.html'));
});

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

app.listen(8080);

Где public - папка, в которой находится код на стороне клиента

Как предложено @ATOzTOA и пояснено @Vozzie, path.join принимает пути для объединения в качестве аргументов, + передает единственный аргумент в path.

Ответ 5

npm install serve-index

var express    = require('express')
var serveIndex = require('serve-index')
var path = require('path')
var serveStatic = require('serve-static')
var app = express()
var port = process.env.PORT || 3000;
/**for files */
app.use(serveStatic(path.join(__dirname, 'public')));
/**for directory */
app.use('/', express.static('public'), serveIndex('public', {'icons': true}))

// Listen
app.listen(port,  function () {
  console.log('listening on port:',+ port );
})

Ответ 6

используйте ниже внутри вашего app.js

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

(имя_папки - это папка, в которой есть файлы) - помните, что доступ к этим ресурсам осуществляется напрямую через путь к серверу (то есть http://localhost: 3000/abc.png (где abc.png находится в папке folderName)

Ответ 7

const path = require('path');

const express = require('express');

const app = new express();
app.use(express.static('/media'));

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'media/page/', 'index.html'));
});

app.listen(4000, () => {
    console.log('App listening on port 4000')
})