Налаштування двох різних статичних каталогів у рамках node.js Express


101

Це можливо? Я хотів би створити два різних каталоги для обслуговування статичних файлів. Скажімо / public та / mnt


2
Здається, ця сторінка говорить про те, що це можливо, але не вникає в нього детальніше.
цибуля-порей

Відповіді:


152

Ви також можете встановити шлях, по якому статичні файли будуть надсилатись до Інтернету, вказавши додатковий (перший) параметр, use()як це:

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

Таким чином ви отримуєте два різних каталоги в Інтернеті, які відображають ваші локальні каталоги, а не один URL-шлях, який не проходить між двома локальними каталогами.

Іншими словами, шаблон URL:

http://your.server.com/public/*

Обслуговує файли з локального каталогу publicпри цьому:

http://your.server.com/public2/*

Обслуговує файли з локального каталогу public2.

BTW, це також корисно, якщо ви не хочете, щоб статичні обслуговували файли з кореня вашого сервера, а скоріше з більш кваліфікованого шляху.

HTH


1
Ідеальний @facetcounter! Щойно вказав сценарій на мій каталог! скрипт (src = "/ public2 / alertTest.js")
Коді

При використанні React і намагаюся служити два окремих додатки, вам потрібно додати "homepage": "/public"і "homepage": "/public2"до відповідних реагувати package.json додатки. Для отримання додаткової інформації про використання двох реагуючих програм див. Мою відповідь тут stackoverflow.com/a/48569896/4746648
Danny Harding

це дуже корисно спеціально, коли ви хочете, щоб sharedпапка, щоб ви могли використовувати "./"та "./shared"
наростати,

55

Ви також можете "об'єднати" каталоги в єдиний видимий каталог

Структура каталогів

  • /static
  • /alternate_static

Код

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

І статичні, і альтернативні_статичні будуть подаватися так, ніби вони перебувають у одному каталозі. Хоча слідкуйте за клоферами назви файлів.


6
Якщо я правильно зрозумів, конфлікти з іменами файлів не трапляються, оскільки вузол використовує першу версію знайденого ним файлу. Якщо він бачить main.jsв static/ньому не буде продовжувати дивитися в alternate_static/.
RobW

2
Це все-таки клобер, якщо ви очікували, що файл alternate_staticколи-небудь буде поданий.
Рандольфо

41

Це неможливо одним введенням програмного забезпечення, але ви можете вводити staticпроміжне програмне забезпечення кілька разів:

app.configure('development', function(){
    app.use(express.static(__dirname + '/public1'));
    app.use(express.static(__dirname + '/public2'));
});

Пояснення

Подивіться на connect / lib / middleware / static.js # 143 :

path = normalize(join(root, path));

Існує options.rootстатичний корінь, який ви визначаєте в express.staticабо connect.staticвиклику, і pathце шлях запиту.

Подивіться більше на підключення / lib / middleware / static.js # 154 :

  fs.stat(path, function(err, stat){
    // ignore ENOENT
    if (err) {
      if (fn) return fn(err);
     return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code)
       ? next()
       : next(err);

Шлях перевіряється лише один раз, і якщо файл не знайдено, запит переходить до наступного середнього програмного забезпечення.

Оновлення для Connect 2.x

Посилання на код неприйнятні для Connect 2.x, але багаторазове використання статичного посередництва все ще можливе, як і раніше.


0
const express = require('express');
const path = require('path');
const pagesPath = path.join(__dirname, '/cheatsheet');
const cssPath = path.join(__dirname, '/stylesheet');
const port = process.env.PORT || 3000;

var app = express();

app.use("/cheatsheet" ,express.static(pagesPath));
app.use("/stylesheet",express.static(cssPath)); 

app.get('/',(request,response)=>{
    response.send('Hello CSS!!!');
  });

app.get('/bad',(request,response)=>{
response.send({error: 'Bad Request'});

});
app.listen(port, ()=> {
console.log(`Server is running on Port ${port}` );
console.log(__dirname);

});

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