Настройка двух разных статических каталогов в платформе 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.

Кстати, это также полезно, если вы не хотите, чтобы static обслуживал файлы из корня вашего сервера, а скорее из более квалифицированного пути.

HTH


1
Идеально @facetcounter! Просто указал скрипт в мою директорию! скрипт (src = "/ public2 / alertTest.js")
Коди

Если вы используете React и пытаетесь обслуживать два отдельных приложения, вам необходимо добавить "homepage": "/public"и "homepage": "/public2"в соответствующее приложение для реакции package.json. Для получения дополнительной информации об использовании двух приложений для реагирования см. Мой ответ здесь stackoverflow.com/a/48569896/4746648
Дэнни Хардинг

это очень полезно, особенно когда вам нужна sharedпапка, чтобы вы могли использовать ее, "./"и "./shared"вы могли легко обмениваться файлами js: 3 Спасибо
Jaacko Torus

55

Вы также можете «объединить» каталоги в один видимый каталог.

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

  • /static
  • /alternate_static

Код

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

И static, и alternate_static будут обслуживаться, как если бы они находились в одном каталоге. Тем не менее, остерегайтесь сокрытия имен файлов.


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

2
Это все еще неприятно, если вы ожидали, что файл alternate_staticкогда-либо будет обслужен.
Randolpho

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это путь запроса.

Посмотрите подробнее на connect / 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.