Какой express маршрут я могу использовать для любого файла в каталоге? - PullRequest
0 голосов
/ 30 января 2020

У меня есть каталог PDF файлов, к которым я хочу получить доступ только авторизованным пользователям. В настоящее время проблема заключается в том, что при переходе по URL-адресу, содержащему данный файл в папке, обратный вызов get не выполняется. Например, я ожидаю, что когда я go до localhost:3000/Buyer_templates/file.pdf выполнит обратный вызов в get. В настоящее время это позволяет мне просматривать PDF, и обратный вызов не выполняется.

app.get('/Buyer_templates/*', (req,res) => {
    res.redirect('/')
})

Приведенный выше код работает, если URL-адрес не является файлом (например, /Buyer_templates/blahblahblah)

Однако, когда я добавляю имя файла (например, Buyer_templates/file.pdf), обратный вызов не активирован.

Я также пробовал эти пути в get

/Buyer_templates/*.*

/Buyer_templates/(.*)

Проблема в том, что обратный вызов не выполняется. Как сделать так, чтобы при вводе любого PDF имени файла в URL выполнялся обратный вызов?

1 Ответ

1 голос
/ 30 января 2020

Когда вы настраиваете маршрут static в Express, любые файлы из иерархии из папки root обслуживаются автоматически. Например, если у меня была структура папок, например, такая:

root
- public
-- css
-- js
-- img

И мой сервер выглядел как

app.use(express.static('public'));
app.use((req, res, next) => {
  console.log(`REQUEST LOGGED: ${req.url}`);
  return next();
});
...

Когда я обращаюсь к любому файлу URL, который находится в пределах этого состояния c root например

/css/somefile.css
/js/somefile.js
/img/somefile.jpg

Тогда вы заметите, что запрос никогда не достигает console.log, потому что Express понимает, что это a. файлы и б. находятся в каталоге stati c и, следовательно, не требуют дальнейшей обработки (следовательно, вы замечаете, что если вы попробуете нефайловые URL, они делают дальнейшую обработку).

В терминах добавив некоторую форму авторизации к файлам stati c, есть несколько способов сделать это, например,

  • исключить эту конкретную папку из маршрута stati c и обработать авторизацию, которую вы будет делать на любом другом маршруте
app.get('/Buyer_templates/*', (req, res, next) => 
  if (/* some authorization check */) {
    return res.sendFile('...');
  } else {
    return res.status(403).send('Unauthorized');
  }
});
  • добавить ваше промежуточное ПО авторизации до вы настроите маршрут stati c (хотя это будет значит, немного больше работы, определяющей, какие URL проверять и т. д. c.)
app.use((req, res, next) => {
  if (req.path.startsWith('/Buyer_templates')) {
    return res.status(403).send('Unauthorized');
  }
  return next();
})
app.use(express.static(__dirname));

Приведенные выше примеры просто упрощены c для демонстрации, но они должны дать вам желаемый эффект. Также стоит отметить, что express.static(__dirname) не рекомендуется, так как это сделает все файлы доступными из root вашего приложения, которое будет включать любой код, который вы, возможно, разместили на сервере. Будь более точным c то есть express.static('Buyer_templates')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...