статичні файли з express.js


213

Я хочу служити index.htmlі /mediaпідкаталогом як статичні файли. Файл індексу повинен подаватися як за адресою, так /index.htmlі за /URL-адресами.

У мене є

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(подвійний index.htmlкомпонент), що, звичайно, не вдається.

Будь-які ідеї?


До речі, я не міг знайти абсолютно жодної документації в Експресі на цю тему ( static()+ її парами) ... засмучує. Документальне посилання також вітається.


2
З експресу 4.x, express.static()обробляється serve-staticпрограмним посередництвом. ви можете знайти його документи на npmjs.com/package/serve-static або github.com/expressjs/serve-static .
Анм

хтось, будь ласка, пояснить, що означає "сервер як статичні файли"?
Абхі

@iLiveInAPineappleUnderTheSea У динамічній веб-програмі, наприклад при використанні програми, вміст сторінки створюється - або генерується - додатком. З іншого боку, статичні файли подаються (здебільшого) немодифікованими з ієрархії статичних каталогів. Наприклад, хоча сторінки можуть змінюватися, файли зображень, файли CSS та файли Javascript не роблять.
Філіп Каллендер

перевірити нижче за посиланням only4ututorials.blogspot.com/2017/05/…
Dexter

Відповіді:


100

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

Обслуговування статичних файлів у експрес- документації або більш детальній serve-staticдокументації , включаючи поведінку обслуговуванняindex.html за замовчуванням :

За замовчуванням цей модуль надсилатиме файли “index.html” у відповідь на запит у каталозі. Щоб відключити цей набір неправдивим або подати новий індекс, передайте рядок або масив у бажаному порядку.


6
І лише для інформації, він буде подавати index.html за замовчуванням у тому іншому каталозі
TheSteve0,

Якщо є лише ОДИН параметр - тоді express.staticочікується, що один параметр буде шлях ....
Сет

188

Якщо у вас є така настройка

/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


15
Application.configure()було задокументовано як спадщина в 3.x та видалено у 4.x. Дивіться відповідь ChrisCantrell для оновленого прикладу.
Анм

Дякую, це дуже допомогло
mdegges

що таке __dirname? Яка його цінність?
Абхі

1
застаріла для останнього експресу.
Джон Хітер

133

У найновішій версії експресу "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');

__dirname - це ключове слово?
Мохаммед Файзан-хан

6
Це глобальний модуль вашого nodejs. nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell

7
__dirname насправді не є глобальним, а є локальним для кожного модуля.
Мохаммед Файзан хан

2
це еквівалент у пітоні, __file__яким ви користуєтесьos.path.dirname(os.path.realpath(__file__))
Abdelouahab

@ChrisCantrell Як я можу додати до статичної папки, якщо у мене є файл public/teams/logo.png?
michal

37

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приймає шляху приєднатися в якості аргументів, то +передає один аргумент в дорозі.


2
path.joinприймає шляхи до об’єднання як аргументи, +передає один аргумент до шляху.
ATOzTOA

@ATOzTOA Ви можете пояснити більше, будь ласка
Мохаммед Замер

Що говорить @ATOzTOA - ви повинні перейти path.join(public + 'index.html')на " path.join(public, 'index.html')І", перебуваючи на ньому, перейти __dirname + "/public/"наpath.join(__dirname, 'public')
Vozzie

Це допомогло мені поєднати статичний сайт з API все в одному
Джефф Біглі

4
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')
})

2

npm встановити службовий індекс

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 );
})

2

використовувати нижче всередині вашого app.js

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

(folderName - папка, у якій є файли) - пам’ятайте, що до цих ресурсів можна отримати доступ безпосередньо через шлях до сервера (тобто http: // localhost: 3000 / abc.png (де як abc.png знаходиться всередині папки folderName)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.