Порт Angular 4200, показывающий данные с html, но порт nodejs 8080, показывающий данные json без html

Я использую угловую 5 с узлом JS, чтобы сделать Crud для данных событий. Когда я пытаюсь получить данные о событиях из порта 4200(http://localhost:4200/event) который бежит через угловой, работает хорошо. Он показывает данные в формате HTML со всеми значениями. Но когда я использую порт 8080(http://localhost:8080/event) который из node js показывает данные только в формате json. Никакое html-содержимое из event.component.html не отображается здесь. express.js выглядит так

/* ===================
Import Node Modules
=================== */
const express = require('express');
const app = express();
const router = express.Router();

const mongoose = require('mongoose');
const config = require('./database');
const path = require('path');
const appRoot = require('app-root-path');

//custom module
const event = require('../config/routes/event.router');

const bodyParser = require('body-parser');
const cors = require('cors');
const port = process.env.PORT || 8080; // Allows heroku to set port


mongoose.Promise = global.Promise;
//assigning value 
process.env.NODE_ENV = 'devlopment';

/**
 * Database connection
 */

mongoose.connect(config.uri, {
  useMongoClient: true,
}, (err) => {
  // Check if database was able to connect
  if (err) {
    console.log('Could NOT connect to database: ', err); // Return error message
  } else {
    console.log('Connected to ' + config.db); // Return success message
  }
});

app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());


app.use(express.static(path.join(appRoot.path, 'dist')));

/**
 * Routing
 */

app.use('/event', event); //Event Router

app.get('*', (req, res) => {
 res.sendFile(path.join(appRoot.path, 'dist/index.html'));
});

/**
 * Assiging port to server
 */
app.listen(port, () => {
  console.log('Listening on port ' + port + ' in ' + process.env.NODE_ENV + ' mode');
});

мой event.router.js выглядит так

const Event = require('../../model/event.model');
var multer  = require('multer');
var upload  = multer({ dest: './public/uploads/img/',fileFilter:function(req,file,cb){
  var ext = file.originalname.split('.').pop();
  cb(null, file.fieldname + '-' + Date.now() + '.' + ext);
    }
}).single('eventimage');

/* GET ALL EVENTS */
router.get('/', function(req, res, next) {
  Event.find(function (err, events) {
    if (err) return next(err);
    res.json(events);
  });
});

/* GET SINGLE EVENT BY ID */
 router.get('/:id', function(req, res, next) {
   Event.findById(req.params.id, function (err, post) {
     if (err) return next(err);
     res.json(post);
   });
 });

module.exports = router;

event.component.html выглядит так

<div class="container">
  <h1>Event List</h1>
  <table class="table">
    <thead>
      <tr>
        <th>Event Id</th>
        <th>Event Name</th>
        <th>Event Desc</th>
        <th>Event Date</th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let event of events">
        <td><a routerLink="/event-details/{{ event._id }}">{{ event._id }}</a></td>
        <td>{{ event.eventname }}</td>
        <td>{{ event.eventdesc }}</td>
        <td>{{ event.eventdates }}</td>
      </tr>
    </tbody>
  </table>
</div>

event.components.ts выглядит так

import { Component, OnInit } from '@angular/core';
import { EventService } from '../event.service';

@Component({
  selector: 'app-event',
  templateUrl: './event.component.html',
  styleUrls: ['./event.component.css']
})
export class EventComponent implements OnInit {

  events: Event[] = [];

  constructor(
    protected eventService: EventService
    ) { }

  ngOnInit() {
    this.getAll();
  }

  getAll() {
    this.eventService.getEvents().subscribe(res => {
      this.events = res as Event[];
    }, err => {
      console.log(err);
    });
  }
}

event.service.ts выглядит так

import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs';
import { HttpClientModule } from '@angular/common/http';

import { HttpClient } from "@angular/common/http";
import 'rxjs/add/operator/map';


@Injectable()
export class EventService {

  domain = 'http://localhost:8080';

  headers = new Headers({ 'Content-Type': 'application/json' });

  constructor(
   private http: Http,
    ) { }

  getEvent(id: string) {
    return this.http.get(this.domain + '/event/' + id, { headers: this.headers }).map(res => res.json());
  }

  getEvents(){
    return this.http.get( this.domain + '/event', {headers: this.headers}).map(res => res.json() );
  }

}

Так может кто-нибудь сказать мне, что здесь не так. Почему я получаю данные в виде json через порт 8080 и почему он хорошо работает с портом 4200? Как я получу данные с html в 8080 порту? Любая помощь и предложения будут действительно заметны.

3 ответа

Решение

Я знал, что это столкновение произойдет, когда я скажу вам переместить события выше запроса get * в другом ответе.

Именно поэтому предложили /api маршрут.

Здесь происходит то, что:

Когда вы обслуживаете свое угловое приложение с узла. т.е. на порт 8080 и запрос

HTTP: // локальный: 8080 / События

Экспресс находит этот маршрут зарегистрированным в модуле событий, поэтому он возвращает данные в форме JSON, и запрос не идет по маршруту, по которому вы возвращаете индексный файл (необходимый для загрузки угловых данных)

В то время как localhost:4200 запрос направляется напрямую в угловой интерфейс командной строки, чтобы они не сталкивались с экспресс-путем.

Как я и предлагал, просто поместите путь "/api" перед каждым API, который вы создаете в Express, и ваша проблема будет решена, так как у Express больше не будет пути "/events", поэтому он будет передавать запрос в app.get(*) функция и ваш угловой файл будут обслуживаться.

NOTE /api - это просто стандартное соглашение об именах, вы можете поставить xyz, и оно будет работать.

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

Ваш маршрут события предоставляет JSON для вызова события в угловом приложении, а не его рендеринг.

Ваше угловое приложение также работает на веб-сервере на 4200, который, вероятно, является своего рода сервером разработки. Затем запросы передаются на экспресс-сервер, который предоставляет внутренние данные.

Чтобы использовать приложение Express для рендеринга углового приложения, необходимо создать приложение и поместить файлы в папку dist приложения Express. Затем любой маршрут, кроме /event, будет отображать угловое приложение. Это раздел кода, который показывает это.

app.get('*', (req, res) => {
 res.sendFile(path.join(appRoot.path, 'dist/index.html'));
});

Если вы находитесь в среде разработки, вам не нужно об этом беспокоиться. Вы можете получить доступ к угловому приложению через порт 4200 и экспресс-приложению по 8080

Очень логично видеть HTML с данными в порту 4200, так как на этом порту вы размещаете свои HTML-файлы Angular, поэтому вы увидите HTML-код независимо от того, работает ваш бэкэнд или нет.

На порте 8080 это тоже очень логично, так как этот порт, на котором размещается серверная часть, отправляет только данные, и этот порт является портом, предоставляющим данные на порт 4200 HTML.

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