【问题标题】:Cannot Post in Angular 13无法在 Angular 13 中发布
【发布时间】:2022-01-07 15:07:16
【问题描述】:

我正在迈出 Angular 的第一步,所以我决定从 CRUD 开始。

我一直在按照指南执行此操作,但我撞到了一堵混凝土墙上,因为我检查了所有内容但找不到解决方案。

我正在尝试创建一个 项目(模型),它有 3 列

  • 标题
  • 描述(可为空)
  • 访问代码(可为空)

我需要发出 POST 请求以将数据添加到我的数据库中(由 Node.js 提供支持,并在 Postman 中正常工作)

这是我的代码:

add-project-component.ts

import {
    Component,
    OnInit
} from '@angular/core';
import {
    Project
} from 'src/app/models/project.model';
import {
    ProjectService
} from 'src/app/services/project.service';

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

    project: Project = {
        title: '',
        description: '',
        accessCode: '',
    };
    submitted = false;

    constructor(private projectService: ProjectService) {}

    ngOnInit(): void {}

    saveProject(): void {
        const data = {
            title: this.project.title,
            description: this.project.description,
            accessCode: this.project.accessCode
        };

        this.projectService.create(data)
            .subscribe({
                next: (res) => {
                    console.log(res);
                    this.submitted = true;
                },
                error: (e) => console.error(e)
            });
    }

    newProject(): void {
        this.submitted = false;
        this.project = {
            title: '',
            description: '',
            accessCode: ''
        };
    }

}

add-project-component.html

<div class="new-project">
    <mat-toolbar>
        <span>New Project</span>
    </mat-toolbar>
    <mat-card>
        <mat-card-content *ngIf="!submitted">
            <p>
                <mat-form-field appearance="outline">
                    <mat-label>Title</mat-label>
                    <input id="title" required [(ngModel)]="project.title" matInput name="title" placeholder="Title">
                </mat-form-field>
            </p>
            <p>
                <mat-form-field appearance="outline">
                    <mat-label>Description</mat-label>
                    <textarea id="description" rows="6" [(ngModel)]="project.description" name="description" matInput placeholder="Description"></textarea>
                </mat-form-field>
            </p>
            <p>
                <mat-form-field appearance="outline">
                    <mat-label>Access Code</mat-label>
                    <input id="accessCode" [(ngModel)]="project.accessCode" name="accessCode" matInput placeholder="Access Code">
                </mat-form-field>
            </p>
        <!-- FORM CONTENT -->
        </mat-card-content>
        <mat-card-actions *ngIf="!submitted">
            <button mat-raised-button color="primary" (click)="newProject()">Create Project</button>
         <!-- REGISTER BUTTON -->
        </mat-card-actions>
    </mat-card>
</div>

services/project.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Project } from '../models/project.model';

const baseUrl = 'http://localhost:8080/api/projects';

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

  constructor(private http: HttpClient) { }

  getAll(): Observable<Project[]> {
    return this.http.get<Project[]>(baseUrl);
  }

  get(id: any): Observable<Project> {
    return this.http.get(`${baseUrl}/${id}`);
  }

  create(data: any): Observable<any> {
    return this.http.post(baseUrl, data);
  }

  update(id: any, data: any): Observable<any> {
    return this.http.put(`${baseUrl}/${id}`, data);
  }

  delete(id: any): Observable<any> {
    return this.http.delete(`${baseUrl}/${id}`);
  }

  deleteAll(): Observable<any> {
    return this.http.delete(baseUrl);
  }

  findByTitle(title: any): Observable<Project[]> {
    return this.http.get<Project[]>(`${baseUrl}?title=${title}`);
  }
}

错误 404

你们能帮帮我吗?我错过了什么? 非常感谢。

【问题讨论】:

  • 没有关于“无法发布”部分的信息
  • 您的意思是在“创建项目”按钮上使用(click)="saveProject()" 而不是(click)="newProject()"
  • 我已将 newProject() 更改为 SaveProject() ,它最终给了我一个错误。现在我收到这个错误:“ Error
    Cannot POST /api/projects
    " 好像 API 获取 POST 请求的路径和 Angular 想的不一样。我怎样才能改变它?
  • 你通过邮递员尝试的路线是什么?服务方法在你的前端是什么样子的?
  • 看来 Angular 没有什么问题。你说api地址是localhost:8080/api/projects/create,但是在你的服务中你已经将请求发送到localhost:8080/api/projects

标签: javascript node.js angular


【解决方案1】:

您的 create 函数指向了错误的 URL。 您想要的 URL 是 /api/projects/create,但您缺少 /create 部分。

改变

create(data: any): Observable<any> {
  return this.http.post(baseUrl, data);
}

create(data: any): Observable<any> {
  return this.http.post(`${baseUrl}/create`, data);
}

鉴于const baseUrl = 'http://localhost:8080/api/projects'; 是正确的。 注意:对于生产,您很可能希望将 baseUrl 更改为 const baseUrl = '/api/projects'; 作为主机将更改(localhost 与您的实际域)。

【讨论】:

  • 非常感谢菲利普!有效!现在我知道如何路由我的 Angular 页面了。泰!!!
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2019-07-27
  • 2019-01-04
  • 1970-01-01
相关资源
最近更新 更多