Angular 4 - проблема с маршрутизацией, добавлен новый маршрут, и он выглядит как другие, но при обновлении страницы выдает ошибку 404

В терминале на моем локальном хосте я вижу, что npm говорит "Ошибка 404 / монеты"

Затем на странице написано Не найдено.

Эти URL-адреса работают нормально

 http://localhost:8808/events/new
 http://localhost:8808/events

Но я ДОБАВИЛ в эти "монеты" одну

Иди туда

http://localhost:8808/coins

Обновить - проблема

navbar.component.html

    <li>
      <a [routerLink]="['/coins']">All Coins</a>
    </li>
    <li>
      <a [routerLink]="['/events']">All Events</a>
    </li>
    <li><a [routerLink]="['/events/new']">Create Event</a></li>

Затем маршруты.ts

export const appRoutes:Routes = [
{ path: 'events/new', component: CreateEventComponent },  // process this first , since we have events/:id
{ path: 'events', component: EventsListComponent },
{ path: 'events/:id', component: EventDetailsComponent },
{ path: 'coins', component: CoinsListComponent },
{ path: '', redirectTo: '/events', pathMatch: 'full'}

]

index.html

 <base href="/">

Так что все работало до добавления этих монет... и обновления страницы, даже жесткого обновления.

  1. Это не Angular 1 (angularJS), это на 100% самая последняя версия 4.0 с import { Routes } from '@angular/router'

В чем может быть проблема?

Обновление: отображение компонента Coin

import { Component, OnInit } from '@angular/core'
import { CoinService } from './coin.service'

@Component({
    template: `
    <div *ngFor="let coin of coinsList">
     abc
     </div>
    `
})
export class CoinsListComponent implements OnInit {
    coinsList:any[]
    constructor(
        private coinService: CoinService
    ){
    }

    ngOnInit() {
        console.log('oninit coins')
        this.coinsList = this.coinService.getAllCoins()
    }
}

person Community    schedule 10.08.2017    source источник
comment
Отвечает ли сервер index.html, когда вы делаете запрос к http://localhost:8808/coins? Если это не так, приложение angular не будет загружено при обновлении страницы на этом маршруте.   -  person Jake Holzinger    schedule 10.08.2017
comment
Если я нажму на ссылку на странице (spa index.html), я перейду к указанному вами URL-адресу .../coins, и console.log действительно покажет oninit coins, что правильно, поскольку у меня есть монеты-list.componet.ts, который имеет Функция ngOnIit с этим console.log... Это когда я щелкаю правой кнопкой мыши и обновляю страницу... страница не найдена... так раздражает   -  person    schedule 10.08.2017
comment
заставляет меня задуматься, не скрывает ли этот курс основ множественного прицела с этим перенаправлением /events тот факт, что, возможно, «события» могли бы взорваться, если бы не было этого последнего перенаправления ... тьфу   -  person    schedule 10.08.2017
comment
Вы можете показать свой компонент монеты?   -  person brijmcq    schedule 10.08.2017
comment
это странно. ваш код выглядит нормально. Ошибка должна быть где-то в другом месте   -  person brijmcq    schedule 10.08.2017
comment
показ компонента монеты   -  person    schedule 10.08.2017
comment
это очень странно, я не могу думать/видеть, что может быть не так, особенно когда нажимается ссылка, и она выдает код из компонента и т. д.   -  person    schedule 10.08.2017
comment
Итак, когда вы обновляете страницу на любом другом маршруте, скажем, /events, это не дает 404, верно?   -  person eko    schedule 10.08.2017
comment
Поэтому, если я перехожу к /events и нажимаю «Обновить», я вижу, что он кратко показывает /events/, затем я удаляю трейлинг / с /coins, мгновенно обновляю при обновлении URL-адрес остается /coins, и он отображает 404   -  person    schedule 10.08.2017
comment
@echonax Правильно, поскольку я набрал комментарий одновременно с вашим комментарием, /events переходит в /events/, а затем /events, я предполагаю, что он основан на index.html   -  person    schedule 10.08.2017
comment
Что вы используете в своем бэкенде?   -  person eko    schedule 10.08.2017
comment
ПОЛУЧИТЬ localhost:8808/coins 404 (не найдено), при обновлении я вижу вывод консоли инструментов разработчика, но не если я нажму и перейду с помощью routerLink на html-странице навигации спа   -  person    schedule 10.08.2017
comment
поэтому в Windows последняя версия node/npm... я не использую ничего, кроме запуска npm   -  person    schedule 10.08.2017
comment
что делает ваш запуск npm? что вы используете для обслуживания вашего приложения? узел.js? лазурь? iis?   -  person eko    schedule 10.08.2017
comment
а потом еще и в package.json "server": "node node_modules/ng2f-server/server.js",   -  person    schedule 10.08.2017
comment
Итак, хотя я использовал web api/mvc в течение многих лет, я использовал локально node , iissnode , liteserver и несколько других легких небольших серверов - как только он будет развернут, я полагаю, что окажусь под IIS - я просто не ожидал этого проблема   -  person    schedule 10.08.2017
comment
Если я изменю базовый href на href=. тогда URL-адрес для монет http://localhost:8808/events/coins не то, что я хочу, но обновление работает ...   -  person    schedule 10.08.2017
comment
Ваш CoinsListComponent импортирован и объявлен в вашем модуле?   -  person Stephen R. Smith    schedule 14.08.2017
comment
@StephenR.Smith да   -  person    schedule 14.08.2017
comment
404 определенно исходит от вашего сервера, скорее всего, ваш сервер не перенаправляет все вызовы на index.html. Если есть 404, значит, приложение Angular не запущено,   -  person Milad    schedule 14.08.2017
comment
Попытка сделать href абсолютным путем и убедиться, что конфигурация вашего сервера правильно перенаправляется,   -  person Milad    schedule 14.08.2017
comment
Вы можете воспроизвести эту проблему, если используете ng serve и посещаете localhost:4200?   -  person Sagar V    schedule 14.08.2017
comment
вы должны убедиться, что маршруты сервера правильно настроены, чтобы это работало, поскольку вы не используете HashLocationStrategy.   -  person micronyks    schedule 14.08.2017
comment
@micronyks можете ли вы объяснить в ответ   -  person    schedule 15.08.2017
comment
что ты хочешь понять @JeremyMiller?   -  person micronyks    schedule 15.08.2017


Ответы (3)


Что вы используете на стороне сервера? ЭкспрессJS? Если это так, кажется, что вы не настроили что-то вроде

сервер/server.ts

const app: Application = express();

app.route('/api/coins/').get(coinsRoute);

сервер /coinsRoute.ts

export function coinRoute(req, res) {

res.status(200).json({ ...
   });
}

И у вас есть вкладка, на которой запущен сервер Express, а также приложение на другой вкладке в вашей консоли.

person JGFMK    schedule 15.08.2017

Используйте useHash:true с @NgModule в app.module.ts

RouterModule.forRoot(appRoutes, { useHash: true })
person sanjay kumar    schedule 09.11.2017

Держите ваше приложение работающим с сервером узла. Я исправил с помощью следующего кода.

//сервер.js

Keep your app running with a node server. I fixed with the following code.

//server.js

   
    'use strict';
    
    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
    var logger = require('morgan');
    var port = process.env.PORT || 8000;
    var path = require('path');
    
    
    var environment = process.env.NODE_ENV;
    
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    app.use(logger('dev'));
    
    // var filespath = require("path").join(__dirname, "index.html");
    // console.log(filespath);
    
    switch (environment) {
      case 'build':
        console.log('environment')
        app.use(express.static(path.join(__dirname, "/")));
    
      // Any deep link calls should return index.html
      app.use('/*', express.static(path.join(__dirname, "index.html")));
        break;
      default:
        console.log('development');
        app.use(express.static(path.join(__dirname, "/")));
    
      // Any deep link calls should return index.html
      app.use('/*', express.static(path.join(__dirname, "index.html")));
        break;
    }
    
    
    app.listen(port, function() {
      console.log('Express server listening on port ' + port);
      console.log('env = ' + app.get('env') +
        '\n__dirname = ' + __dirname +
        '\nprocess.cwd = ' + process.cwd());
    });

for more you can see my code in git: https://github.com/HelloSofts/hoq-prod

для получения дополнительной информации вы можете увидеть мой код в git: https://github.com/HelloSofts/hoq-prod< /а>

person Zahirul Haque    schedule 17.10.2018