Моему приложению Angular MEAN STACK не удается получить / прочитать запросы HTTP от моего API? - PullRequest
1 голос
/ 21 января 2020

ошибка Во-первых, я создал API, который будет получать и публиковать: еще ошибка

const express = require('express');
const router = express.Router();
const model = require('../models/taskModel');


router.get('/tasks', (req, res) => {
model.find()
    .then((task) => {
        res.json(task);
        console.log(task);
    })
    .catch((err) => {
        console.log(`Error: ${err}`);
    })
})


router.post('/add', (req, res) => {
const userData =
{
    title: req.body.title,
    description: req.body.description,
    isDone: req.body.isDone
}

const newUser = new model(userData);

newUser.save()
    .then(() => res.json('User Added!'))
    .catch((err) => {
        console.log(`Cannot add user: ${err}`);
    })

})

У меня есть служебный файл, который выглядит примерно так:

import { Injectable } from '@angular/core';
import { taskData } from '../Models/task-interface';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs';


// Http
const httpOptions = {
  headers: new HttpHeaders({ 'Content-type': 'application/json' })
}

@Injectable({
  providedIn: 'root'
})
export class RequestsService {

  tasks: taskData[];

  key: string = `http://localhost:5000/api/tasks`;

  constructor(private http: HttpClient) { }

  getTasks(): Observable<taskData[]> {
  return this.http.get<taskData[]>(this.key);
}

}

Затем я вызываю функцию 'getTasks ()' из моего служебного модуля внутри моего компонента:

import { Component, OnInit } from '@angular/core';

import { RequestsService } from '../../Services/requests.service';

import { taskData } from '../../Models/task-interface';

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

  tasks: taskData[];

  constructor(private reqService: RequestsService) {

  }

  ngOnInit() {
   this.reqService.getTasks().subscribe((data: taskData[]) => {
   this.tasks = data;
   console.log(`This is my log: ${this.tasks}`);
    })
  }

}

Внутри моего компонента. html, я использую ngFor для go выполнения задач и получения каждой задачи из моей базы данных mongoDB:

   <div class="d-flex justify-content-around align-items-center" *ngFor="let task of tasks">

                    <input type="checkbox" name="" id="">

                    <h2 class="text-center">{{task.title}}</h2>
                    <p class="text-center">{{task.description}}</p>

                    <button class="btn btn-danger">Delete Task</button>
                </div>

Это сообщение об ошибке, которое я получаю при запуске этого приложения. (ps запросы get и post работают в почтальоне, но, очевидно, не могут быть прочитаны моим angular приложением)

ЗАБЫЛИ ПОКАЗАТЬ МОЮ МОДЕЛЬ:

export interface taskData {
    title: string,
    description: string,
    isDone: boolean
}

1 Ответ

0 голосов
/ 22 января 2020

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

Когда вы пытаетесь получить ответ с помощью браузера, существует разница в происхождении приложения и API, так что это приводит к CORS проблема.

Вы можете решить эту проблему, используя пакет 'cors' npm.

Установите его как локальную зависимость:

 npm install cors --save

Добавьте его в качестве промежуточного программного обеспечения в приложение.

Обновленный код после добавления cors:

const express = require('express');
const router = express.Router();
const model = require('../models/taskModel');
const cors = require('cors');
let app = express();

app.use(cors());

router.get('/tasks', (req, res) => {
model.find()
 .then((task) => {
    res.json(task);
    console.log(task);
 })
 .catch((err) => {
    console.log(`Error: ${err}`);
 })
})

router.post('/add', (req, res) => {
const userData =
 {
   title: req.body.title,
   description: req.body.description,
   isDone: req.body.isDone
 }

const newUser = new model(userData);

newUser.save()
 .then(() => res.json('User Added!'))
 .catch((err) => {
    console.log(`Cannot add user: ${err}`);
 })

Это позволит CORS (Cross-Origin-Resource-Sharing) приложению вашего узла.

Это дубликат Как включить cors nodejs с express?

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