Когда в ответ на мой вызов AspNetCore API POST возвращается ошибка, я случайно получаю TypeError , возвращенный моему сервисному вызову Angular, вместо ожидаемого HttpError 400 .В этом конкретном случае POST должен отправить SMS-уведомление сотруднику, но если его номер телефона отсутствует, HttpError 400 возвращается с «Недопустимый номер телефона сотрудника».К сожалению, это работает только случайно, примерно в 1/2 раза.В других случаях ошибка TypeError вызывается командой rxjs:
"TypeError: rxjs__WEBPACK_IMPORTED_MODULE_4__.Observable.throw is not a function
at AuthResponseInterceptor.handleError ...
at CatchSubscriber.selector ...
at CatchSubscriber.error ...
..."
Полный код довольно длинный, поэтому я просто публикую соответствующие методы.Как вы можете видеть, я думал, что проблема в throwError, поэтому я прокомментировал это, и TypeError все еще происходит случайным образом.Я использую angular / core версии 7.2.6 и rxjs версии 6.4.0
Я нашел 7 похожих сообщений в StackOverflow, но ни одна из них не устранила ошибку.
// the service code
//
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { Alert, AlertStaff } from '../domain/alert';
@Injectable()
export class AlertService {
constructor(private http: HttpClient) { }
postAlert(alertStaff: AlertStaff): Observable<any> {
return this.http.post<any>('/api/Alerts/Action', alertStaff)
.pipe(catchError(err => {
// return throwError(err.error || err.message|| 'Alert Action failed');
// This code was added just to demonstrate the problem more clearly
if (err.error) {
// err is of type HttpErrorResult, so send back the error message
return of(err.error);
}
else {
//UNEXPECTED TypeError !!!
return of('Alert Action failed');
}
}));
}
}
// the controller code
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MyApp.UI.Models;
using MyApp.UI.ViewModels;
[Route("api/[controller]")]
[ApiController]
public class AlertsController : Controller
{
private readonly SmsService textService;
[HttpPost("Action")]
public async Task<IActionResult> PostAlert([FromBody] AlertStaffViewModel notifyStaff)
{
// check the request inputs
if (!this.ModelState.IsValid)
{
return this.BadRequest(this.ModelState);
}
// get the staff
Staff staff = await this.dbContext.Staff.FirstOrDefaultAsync<Staff>(s => s.StaffId == notifyStaff.StaffId).ConfigureAwait(false);
if (staff == null)
{
return this.BadRequest("Staff not found");
}
// alert the staff
if (string.IsNullOrWhiteSpace(staff.TextNumber))
{
// THIS IS THE ERROR BEING TRIGGERED
return this.BadRequest("The staff's telephone number is invalid.");
}
await this.textService.Send(staff.TextNumber, notifyStaff.AlertNotifyMethod).ConfigureAwait(false);
notifyStaff.NotifiedFlag = true;
return this.Ok(notifyStaff);
}
}