Express-js не може отримати мої статичні файли, чому?


308

Я звів свій код до найпростішої програми Express-js, яку я міг зробити:

var express = require("express"),
    app = express.createServer();
app.use(express.static(__dirname + '/styles'));
app.listen(3001);

Мій каталог виглядає так:

static_file.js
/styles
  default.css

Однак, коли я отримую доступ, http://localhost:3001/styles/default.cssя отримую таку помилку:

Cannot GET / styles /
default.css

Я використовую express 2.3.3і node 0.4.7. Що я роблю неправильно?


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

Відповіді:


491

Спробуйте http://localhost:3001/default.css.

Щоб мати /stylesу своєму запиті URL, використовуйте:

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

Подивіться приклади на цій сторінці :

//Serve static content for the app from the "public" directory in the application directory.

    // GET /style.css etc
    app.use(express.static(__dirname + '/public'));

// Mount the middleware at "/static" to serve static content only when their request path is prefixed with "/static".

    // GET /static/style.css etc.
    app.use('/static', express.static(__dirname + '/public'));

42
Дякую. Як хтось, хто є новим у Node та Express, документація Express здається схематичною, поки ви не виявите, що Connect знаходиться там, де перебувають документи проміжного програмного забезпечення.
Нейт

4
Так. Це була пропущена коса риса в моєму випадку.
borisdiakur

У моєму випадку я не розумів, що шлях горіння включений у шлях, як ви пояснили у другому прикладі. Дякую!
Майк Чіл

У разі нової інсталяції слід переконатися, що ваш експрес-модуль встановлений належним чином ( expressjs.com/en/starter/installing.html ), тоді слід перевірити шлях та ім’я вашого каталогу, як сказав Giacomo;)
Spl2nky

завжди використовуйте path.joinдля подолання проблем з роздільником міжплатних каталогів. path.join (__ dirname, '/')
Дуг Чемберлен

35

У мене така ж проблема. Я вирішив проблему із наступним кодом:

app.use('/img',express.static(path.join(__dirname, 'public/images')));
app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));
app.use('/css',express.static(path.join(__dirname, 'public/stylesheets')));

Приклад статичного запиту:

http://pruebaexpress.lite.c9.io/js/socket.io.js

Мені потрібно більш просте рішення. Чи існує?


Дякуємо, що поділилися своїм рішенням незалежно від того, оптимально це чи ні. Якщо ви хочете знову відкрити проблему для оптимізації, розгляньте можливість опублікувати нове запитання, де детально описуються нові обставини. Якщо оптимізація є єдиною метою, питання може бути краще підходить для перегляду коду SO .

15

default.css має бути доступний за адресою http://localhost:3001/default.css

stylesУ app.use(express.static(__dirname + '/styles'));просто говорить висловити , щоб подивитися в stylesкаталозі для статичного файлу , щоб служити. Це не (заплутано), то утворює частину шляху, на якому він доступний.


3
Повністю! Який за угодою в express.js ви це робите на /publicякому є css, js, imgпапки , так що ви можете http://localhost:3001/css/default.css:)
Kit Sunde

15

Ця робота для мене:

app.use('*/css',express.static('public/css'));
app.use('*/js',express.static('public/js'));
app.use('*/images',express.static('public/images'));

9

У вашому сервері.js:

var express   =     require("express");
var app       =     express();
app.use(express.static(__dirname + '/public'));

Ви оголосили експрес та додаток окремо, створіть папку з назвою "загальнодоступна" або як завгодно, і все ж можете отримати доступ до цієї папки. У своєму шаблоні src ви додали відносний шлях від / public (або ім'я долі вашої папки до статичних файлів). Остерігайтеся барів на маршрутах.


6

Що для мене спрацювало:

Замість того, щоб писати app.use(express.static(__dirname + 'public/images'));у своєму app.js

Просто напишіть app.use(express.static('public/images'));

тобто видаліть ім'я кореневого каталогу у шляху. І тоді ви можете ефективно використовувати статичний шлях в інших js-файлах, наприклад:

<img src="/images/misc/background.jpg">

Сподіваюся, це допомагає :)


Це вирішило моє питання. У моєму коді шлях до CSS працював чудово навіть при конкатенації __dirname (використовуючи path.join), тоді як отримання js не вдалося.
Чим

Я радий, що допомогло :)
Амір Аслам

5

Я використовую у своїй програмі Bootstrap CSS, JS та Fonts. Я створив папку з назвою assetв кореневому каталозі програми і розмістив всі ці папки всередині неї. Потім у файл сервера додано наступний рядок:

app.use("/asset",express.static("asset"));

Ця лінія дозволяє мені завантажувати файли , які знаходяться в assetдиректорії з /assetшляхом префікса , як: http://localhost:3000/asset/css/bootstrap.min.css.

Тепер у представленнях я можу просто включити CSS та JS, як показано нижче:

<link href="/asset/css/bootstrap.min.css" rel="stylesheet">

5

для обслуговування статичних файлів (css, зображень, js-файлів) всього два кроки:

  1. передайте каталог файлів css до вбудованого програмного забезпечення express.static

    var express = require('express');
    var app = express();
    /*public is folder in my project directory contains three folders
    css,image,js
    */
    //css  =>folder contains css file
    //image=>folder contains images
    //js   =>folder contains javascript files
    app.use(express.static( 'public/css'));
  2. для доступу до CSS-файлів або зображень просто введіть URL-адресу http: // localhost: port / filename.css ex: http: // localhost: 8081 / bootstrap.css

Примітка: для з'єднання файлів css з html просто введіть<link href="file_name.css" rel="stylesheet">

якщо я напишу цей код

var express = require('express');
var app = express();
app.use('/css',express.static( 'public/css'));

для доступу до статичних файлів просто введіть URL: localhost: port / css / filename.css ex: http: // localhost: 8081 / css / bootstrap.css

Зауважте, щоб зв’язати файли css з html просто додайте наступний рядок

<link href="css/file_name.css" rel="stylesheet">    

3

цей працював на мене

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

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

app.use('/shopping-cart/javascripts',express.static(path.join(__dirname, 'public/javascripts')));

app.use('/shopping-cart/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

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

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

1

Спробуйте отримати доступ до нього за допомогою http: // localhost: 3001 / default.css .

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

Ви фактично даєте йому ім'я папки, тобто стилі, а не ваше передмістя.


1

Я знаходжу свій файл css і додаю до нього маршрут:

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

Тоді, здається, працює.


Я б не рекомендував такий підхід, як ви повинні використовувати ExpressJS .use()та express.static()методи для надсилання туди, де ви обслуговуєте свої файли. Інакше у вас буде один із цих маршрутизаторів на файл у вашому загальнодоступному каталозі, і це дуже багато витрат на підтримку.
Sgnl

Це робота навколо, але я не думаю, що це доречно. Якщо у вас багато файлів CSS та JS, як ви можете їх підтримувати?
аршо

0

На додаток до вище, переконайтеся, що статичний шлях до файлу починається з / (ex ... / tools / css) ... для обслуговування статичних файлів у будь-якому каталозі над головним каталогом (/ main)


2
Доповнення до того, що вище? Зазначте це у своїй відповіді (надайте кредит тому, хто опублікував її, якщо вам доведеться). Так часто змінюється порядок відповідей, щоб усі відповіді були помічені, а не перші кілька. Ми не знаємо, про що ти говориш.
Захарій Кнібель

0

якщо ваша установка

myApp
  |
  |__ public
  |     |
  |     |__  stylesheets
  |     |     |
  |     |     |__ style.css
  |     |
  |     |___ img
  |           |
  |           |__ logo.png
  |
  |__ app.js

потім
введіть у app.js

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

і зверніться до свого style.css: (у деяких файлах .pug):

link(rel='stylesheet', href='/static/stylesheets/style.css')

Чому ви запровадите крок перейменування public -> статичний? Я б сказав, що це просто більше заплутує додаткову інформацію. Але тоді знову непряме - це звичайно добре ...
masterxilo

0
  1. Створіть папку з ім'ям 'public' у папці проекту Nodejs
    .
  2. Помістіть файл index.html у папку проекту Nodejs.
  3. Покладіть весь скрипт та файл css у загальну папку.
  4. Використовуйте app.use( express.static('public'));

  5. і index.html правильним шляхом сценаріїв до<script type="text/javascript" src="/javasrc/example.js"></script>

А зараз все добре працює.


0

статичний каталог

перевірте наведене вище зображення (статичний каталог) на наявність структури dir

const publicDirectoryPath = path.join(__dirname,'../public')
app.use(express.static(publicDirectoryPath))


//  or

app.use("/", express.static(publicDirectoryPath))
app.use((req, res, next) => {
res.sendFile(path.join(publicDirectoryPath,'index.html'))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.