Как использовать express.static () с путем к каталогу на основе URL? - PullRequest
0 голосов
/ 25 января 2019

Я создаю сервис, включающий систему, в которой пользователь получает бесплатный поддомен, такой как archiebaer.blahblahblah.demo, и у меня есть функция для получения файла конфигурации сайта (siteconf()), который содержит ключ под названием theme. Я хочу, чтобы archiebaer.blahblahblah.demo/theme-static/style.css использовал express.static() для обслуживания папки на основе этого ключа темы.

Например. app.get('/theme-static', express.static("themes/ABC/theme-static")); где ABC - название темы.


Пример сценария: johnsmith и archiebaer - оба пользователя. Конфигурационный файл Джона выглядит примерно так: {theme:'retro'}, а у Арчи {theme:'slate'}. Вы можете получить файл конфигурации пользователя из параметра запроса экспресс-маршрута, используя siteconf(req). Когда я захожу на /theme-static/style.css на сайте Арчи, я должен получить файл ~/projectfolder/themes/slate/style.css, а на Джоне: ~/projectfolder/themes/retro/style.css.


Я предполагаю, что код будет выглядеть примерно так:

app.get('/theme-static', function (req, res) {
   res.send(express.static('themes/' + siteconf(req).theme + '/theme-static/'));
});

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете просто использовать что-то вроде:

app.use("/theme-static", express.static(path.join(__dirname, "pathToFolder")));

Если файл не существует, Express обработает для вас ошибку.

0 голосов
/ 25 января 2019

Вот мое решение:

app.get('/theme-static/*', function (req, res, next) {
  var relurl = req.url.replace("/theme-static/", "");
  if (relurl === '') {
    //This is so '/theme-static/' without any file after is treated as normal 404.
    next();
    return;
  }
  var filePath = "themes/" + siteconf(req).theme + "/theme-static/" + relurl;
  if (fs.existsSync(filePath)) {
    res.sendFile(path.join(__dirname, filePath));
  } else {
    res.status(404).send("Invalid File");
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...