【问题标题】:HttpClient is not working properly on RESTful APIHttpClient 在 RESTful API 上无法正常工作
【发布时间】:2019-03-01 22:36:32
【问题描述】:

Delete 方法没有给我一个错误,因为我将 1000 作为参数传递,该参数不存在于“https://jsonplaceholder.typicode.com/posts”json 文档中。相反,它只是删除选定的文档。我到处搜索,但没有找到任何指定如何解决此问题的代码。任何帮助将不胜感激,因为我是 Angular 框架的新手。

以下是我的服务代码文件(post.service.ts)

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { catchError } from 'rxjs/operators';
import { Observable, throwError } from 'rxjs';
import { NotFoundError } from '../common/not-found-error';
import { AppError } from '../common/app-error';
import { BadInput } from '../common/bad-input';

// For handling Http Requests
import { HttpClient, HttpErrorResponse } from '@angular/common/http';

@Injectable({
    providedIn: 'root'
})
export class PostService {
    private url = 'https://jsonplaceholder.typicode.com/posts';
    private userUrl = 'https://jsonplaceholder.typicode.com/users';

    constructor(private http: HttpClient) {}

    getPosts() {
        return this.http.get(this.url);
    }

    deletePost(id) {
            console.log('Service Id: ', id);
            return this.http.delete(this.url + '/' + id)
                .pipe(
                    catchError((error: HttpErrorResponse) => {
                        if (error.status === 404) {
                            console.log('You screwed');
                            return throwError(new NotFoundError());
                        }
                        return throwError(new AppError(error));
                    })
                );

这是我的组件文件(post.component.ts)

deletePost(post) {
    console.log('Post Id is: ', post.id);
    this.service.deletePost(1000)
        .subscribe(
            response => {
                let index = this.posts.indexOf(post);
                this.posts.splice(index, 1);
                console.log(response);

            },
            (error: AppError) => {
                if (error instanceof NotFoundError) {
                    alert('This post has already been deleted');
                } else {
                    alert('An Unexpected error occurred.');
                    console.log(error);
                }
            });
}

ngOnInit() {
    this.service.getPosts()
        .subscribe((response) => {
            this.posts = response;
            console.log('Posts: ', this.posts);
        }, error => {
            alert('An Unexpected error occurred.');
            console.log(error);
        });
}

这是我的 Component.html 文件(posts.component.html)

<ul class="list-group">
    <li *ngFor="let post of posts" class="list-group-item">
        <button (click)="deletePost(post)" class="btn btn-danger btn-sm">Delete</button>{{ post.title }}
    </li>
</ul>
<br>

【问题讨论】:

  • 您的服务工作正常吗?我不明白您的问题,“它只是删除选定的文档”是什么意思。 ?以及为什么将参数设置为“this.service.deletePost(1000)”,用于测试目的?我可以用 stackblitz 重现你的问题,我可以提供帮助。
  • 是的,我的服务运行正常。 “它只是删除选定的文档”是指-当我尝试单击前端的删除按钮时,它会从前端删除该元素。相反,它应该抛出一个错误,说“这篇文章已经被删除”。 this.service.deletePost(1000) 用于测试目的,以确保它是否抛出错误。
  • 这意味着您的 this.service.deletePost(1000) 操作成功(或),您的服务上的“catchError”属性有问题。 (post.service.ts)
  • 是的。只是不知道是哪一部分出了问题。
  • 我将与您分享我的服务,因此您可以使用它作为示例。给我一点时间。

标签: angular rest angular6 angular-httpclient


【解决方案1】:

您调用的 API 返回一个 JSONObject。不是错误。查看 API 的 POSTMAN 调用

由于这不是错误,因此不会执行 CatchError。

更新
由于没有错误,您的成功部分将执行。它采用现有posts 数组中返回对象的索引。如果您将索引记录到控制台,您可以看到它是-1。
在不检查是否找到索引的情况下,您将其传递给 splice。 array.splice(-1,1) 将从数组中删除最后一个元素。因此li 元素被删除。

更多关于Array.indexOfArray.splice

您必须检查返回对象的索引是否存在于您的数组中。然后进行拼接。

【讨论】:

  • 谢谢。那么我应该添加/删除什么来执行该 catchError 块?
  • catchError 块仅在出现错误时执行。如果你想测试它,你可以简单地改变 url ,所以会抛出 404。
  • 是的。我明白为什么不执行 CatchError 了。但是在 http 请求中,我将 1000 作为参数传递,因此不应从组件中删除“li 元素”,因为在 id 为 1000 的帖子中没有这样的文档。
  • 我已经在控制台打印了 index 的值。它显示了 post 数组中执行删除操作的元素的索引。另外,当我通过 1000 时,它没有将 index 的值显示为 -1。那么我的代码有什么问题?
  • 打印的索引值是多少?
【解决方案2】:

我正在使用这种方法,希望对您有所帮助。 (如果您将服务结果作为 Observable 返回,则从组件端管理它的结果会更容易。)

更新:

myService.ts

deleteDocumentService(documentId: number): Observable < any > {
    var result: Observable < any > = this.http.delete < any > (`${this.apiBaseUrl}document/${documentId}`);
    return result;
}

myComponenet.ts

import {myService} from './Services/myService'

deleteDataSubscription: Subscription;
data: any;


constructor(public _myService: myService) {}

//you will fire this function when button is clicked
deleteDocument(id:number) {
    //call your delete service here
    this.deleteDataSubscription = this._myService.deleteDocumentService(id)
        .subscribe(
            (success) => {
                //if your delete operation is succesfully, do what ever you want here
                //now you can fire a function or trigger to remove entry from your table
            },
            (error) => {
                //if your delete operation is unsuccesfully, console log error.                      
                console.log(err);
            }
        }
);
}

【讨论】:

  • 好的,谢谢。如果你能告诉我代码是什么会更好 - 如果给定的文档在后端不存在,那么它不应该删除“li元素”。因为无论文档是否存在,“li 元素”都会被删除。再次感谢。
  • 谢谢。我现在明白了。
猜你喜欢
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多