Как настроить серверную часть или интерфейс, чтобы избежать ошибки, не найденной 404 при запуске ng build - PullRequest
0 голосов
/ 05 июля 2019

Я задаю этот вопрос, потому что я не уверен, является ли решение моей проблемы с внешнего или внутреннего интерфейса.

В принципе, у меня проблема в том, что при перезагрузке страницы по другому маршруту, чем в начале "/", я получаю ошибку "not found 404", я видел несколько возможных решений, таких как "хэш", но для проблем с SEO Я не могу сделать это. Я также видел, что есть конфигурации для решения этой проблемы, но эти конфигурации находятся на серверах Apache или в ISS.

Мое приложение работает нормально при использовании angular-cli с ng serve, но когда я запускаю

ng build --prod --base-href=./ and --deploy-url=./

маршруты не работают при перезагрузке страницы.

Например:

http://localhost/my_folder_compilated/programa/detalle-programa/5cf7d27faa8e180017211754    --> 404 not found!

Мне нужно развернуть его на сервере Heroku или, если он отсутствует, работать на nodejs.

Как я могу решить эту проблему?

// this is the route that I have in my app.routing.ts
{path: 'programa/detalle-programa/:programaId', component: 
DetalleProgramaComponent},
{path: '**', component: NotFoundComponent}

Примечание

Я думаю, что решение находится в бэкэнде. Я использую nodejs (экспресс), но не могу это исправить.

Обновление

Я использую этот код и хорошо работает для моих маршрутов,

const distDirectory = path.join(__dirname, 'public');

app.get('*', function (req, res, next) {
const file_path = path.join(distDirectory, req.url.split('?').shift());
console.log(file_path)
if (fs.existsSync(file_path)) next();
else res.sendFile(path.join(distDirectory, 'index.html'));
});

app.use(express.static(distDirectory));

кроме этого:

localhost/programa/detalle-programa/5cf7d27faa8e180017211754

и в консоли это маршрут, который я получаю:

   ...public\programa\detalle-programa\runtime.366eb317d0165de30d51.js

очевидно, что он не существует, и он отмечает ошибку в моих файлах

Обновление 2:

Папка на моем сервере heroku:

public --> here my files, and the index.html 

и мой index.html:

<head>
    <meta charset="utf-8">
    <title>title</title>
    <base href="/">

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/x-icon" href="favicon.ico">
    <link rel="stylesheet" href="styles.51e30e538d2560c1a9e9.css">
</head>


<body>
    <app-root ></app-root>
    <script type="text/javascript" src="/runtime.a5dd35324ddfd942bef1.js">
    </script>
    <script type="text/javascript" src="/polyfills.3eb7881d3a00da6c675e.js">
    </script>
    <script type="text/javascript" src="/scripts.dd86f002a5aef1b13f0f.js">
    </script>
    <script type="text/javascript" src="/main.23ac360bc829b49bc07d.js">
    </script>
</body>

</html>

Проблема, которая возникает со мной, заключается в том, что все запросы, которые я получаю, возвращают мой файл index.html, поэтому обещания моих служб не могут быть решены.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Используйте следующие настройки в вашем экспресс-файле index.js, задайте distDirectory для вашего каталога dist.

const path = require('path');
const express = require('express');
const fs = require('fs');

const app = express();

const distDirectory = path.join(__dirname, 'dist');

app.get('*', function (req, res, next) {
    const file_path = path.join(distDirectory, req.url.split('?').shift());
    if (fs.existsSync(file_path)) next();
    else res.sendFile(path.join(distDirectory, 'index.html'));
});

app.use(express.static(distDirectory));

app.listen(80, function () {
    console.log('listening');
});

Обновление: с использованием вышеуказанного кода ваши маршрутыработает, но вы получаете 404 для файлов JavaScript и CSS.Причина:

// Never use a leading dot in base-href
ng build --prod --base-href=./
                            ^^

Несколько примеров действительного базового URL:

website url: http://localhost/my_folder_compilated/
base url:    /my_folder_compilated/

website url: http://localhost:4200/public/
base url:    /public/

NB: Вам не нужно устанавливать --deploy-url=./, используйтеbase-url только.

2 голосов
/ 07 июля 2019

Вы должны перенаправить все маршруты на ваше приложение Angular index.html.Это связано с тем, что ваш веб-интерфейс обрабатывает навигацию, а не бэкэнд.

Если вы, например, используете экспресс, у вас может быть маршрут общего доступа:

server.get('/*', (req, res) => {
  res.sendFile(__dirname + '/index.html');
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...