Экспресс * все маршруты никогда не запускаются с приложением create response при использовании app.use(express.static)

Я использую CRA и запускаю экспресс-приложение, но когда я запускаю экспресс-приложение localhost:8080 для рендеринга моего файла index.html, оно никогда не запускает app.get("*"). Кажется, он использует статическое использование и загружает html оттуда.

Любые идеи о том, что это может происходить?

сервер/index.js

const express = require("express");
const path = require("path");

const PORT = process.env.PORT || "8080";
const app = express();

const indexPath = path.join(__dirname, "../build/index.html");
app.use(express.static(path.resolve(__dirname, "../build")));

app.get("/test", (req, res) => {
  res.json({ message: "welcome to backend" });
});

app.get("*", (req, res) => {
  console.info("sending index.html");
  res.sendFile(indexPath);
});

app.listen(PORT, () => console.info(`listing on port ${PORT}`));

Моя структура папок.

Экспресс * все маршруты никогда не запускаются с приложением create response при использовании app.use(express.static)

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если это:

app.use(express.static(path.resolve(__dirname, "../build")));

находит соответствие для входящего запроса в вашем каталоге сборки, затем он обработает запрос, и маршруты, которые у вас есть, никогда не получат возможности обслужить входящий запрос. Вот как работает express.static(). Если у вас есть маршрут, которому вы не хотите, чтобы express.static() соответствовал, убедитесь, что в вашей статической структуре каталогов нет файла, соответствующего пути входящего маршрута.

В конкретном случае, который вы упомянули, если express.static() увидит запрос на /, то он будет искать index.html в каталоге, который вы указали express.static(), и если он найдет его там, он просто обслужит его и завершит запрос.

Вы можете контролировать соответствие / и index.html несколькими способами. Во-первых, если в этом каталоге index.html нет build, то express.static() его не найдет. Или, во-вторых, вы можете передать параметр конфигурации {index: false} в express.static(), чтобы сообщить ему, что вы не хотите, чтобы он обслуживал index.html для / следующим образом:

app.use(express.static(path.resolve(__dirname, "../build"), {index: false}));

В вашем конкретном случае неясно, почему это проблема, потому что ваш маршрут:

const indexPath = path.join(__dirname, "../build/index.html");

app.get("*", (req, res) => {
  console.info("sending index.html");
  res.sendFile(indexPath);
});

Просто отправляет один и тот же файл index.html в любом случае.

К вашему сведению, как правило, не считается разумным отправлять index.html для любого запроса URL-адреса, который в остальном соответствует вашему запросу app.get('*', ...), потому что поисковым системам и другим роботизированным сканерам сложнее определить, какие страницы действительно существуют на вашем сайте, а какие нет. . Вы, вероятно, также не хотите, чтобы пользователи добавляли в закладки несуществующий URL-адрес, который просто работает, поскольку эта страница может измениться на какой-то другой реальный контент или какую-то другую цель в будущем.

{index: false} отлично сработало, спасибо. Не уверен, что понял ваш FYI? не могли бы вы привести пример того, как правильно его использовать? Это одностраничное приложение CRA, поэтому ему необходимо загрузить index.html для всех маршрутов.

me-me 17.03.2022 06:36

@me-me - Если входящий URL-адрес не соответствует ни одной из ваших реальных страниц, вы можете вернуть ответ 404 с соответствующей страницей (здесь нет контента). Это говорит всем (включая сканирующих ботов), что по этому URL-адресу нет контента.

jfriend00 17.03.2022 06:38

Но я хочу, чтобы он перехватывал все URL-адреса и загружал файл index.html. У меня могут быть динамические маршруты, которые обрабатываются на внешнем интерфейсе с помощью реактивного маршрутизатора. пример: локальный: 8080/коллекция/10

me-me 17.03.2022 06:47

@me-me - я просто советую вам несколько причин, по которым использование index.html для всех возможных URL-адресов, включая все те, которые на самом деле не существуют, не считается хорошей идеей. Если вы все еще хотите сделать это, несмотря на этот совет, или вы думаете, что у вас есть действительно веская причина для этого, вы можете - я не останавливаю вас. Маршруты, которые существуют только на стороне клиента, не будут работать с поисковыми системами.

jfriend00 17.03.2022 07:03

Я понимаю, что вы говорите, что это плохая практика. Таким образом, вы предлагаете добавлять только маршруты для html, которые соответствуют тому, что мне нужно в моем приложении, и любые другие маршруты, которые не соответствуют отправке пользователя на 404. Поэтому вы предлагаете?

me-me 17.03.2022 07:31

@me-me - маршрут, который не имеет собственного фактического содержимого (таким образом, маршрут на самом деле не существует), должен давать ошибку 404. Статус 404 все еще может возвращать веб-страницу, так что если пользователь неправильно набирает в браузере , вы по-прежнему даете им что-то полезное, но этого не должно быть index.html - это должна быть страница, которая сообщает им, что это недействительный URL-адрес, и даете им одну или несколько ссылок, по которым можно щелкнуть, чтобы перейти к index.html или туда, где вы хотите помочь они идут.

jfriend00 17.03.2022 07:34

Другие вопросы по теме