#angular #typescript #observable #mean-stack
#angular #typescript #наблюдаемый #средний стек
Вопрос:
У меня есть интерфейс:
export interface MyMedicine {
_id: String;
name: String;
quantity: Number;
time: String;
}
Это мой угловой сервис для публикации данных:
postMed(newMed): Observable<MyMedicine[]>{
var headers = new HttpHeaders();
headers.append('Content-Type', 'application/json');
return this.http.post<MyMedicine[]>(`${this.url}/api/medicine`, newMed, {headers:headers});
}
Это мой компонент с addmedicine () для публикации данных при отправке формы:
addmedicine(){
const newMedicine = {
name: this.name,
quantity: this.quantity,
time: this.time
};
this.medService.postMed(newMedicine)
.subscribe(medicine =>{
this.medicines.push(medicine);
})}
Я получаю сообщение об ошибке, в котором говорится: «Аргумент типа ‘MyMedicine[]’ не может быть присвоен параметру типа ‘MyMedicine’.
В типе ‘MyMedicine[]’ отсутствуют следующие свойства из типа ‘MyMedicine’: _id, имя, количество, время»
Я импортировал интерфейс и сервис в свой компонент. Внедрение зависимостей было выполнено. _id — это идентификатор по умолчанию, который генерируется MongoDB.
Комментарии:
1. Не могли бы вы попробовать с
this.medicines = [...this.medicines, ...medicine]
?2. @VLAZ Все наоборот.
postMed
возвращает массив элементов иthis.medicines.push
ожидает один элемент.3. @Emilien Я попробовал ваш метод, и я получаю сообщение об ошибке «В типе ‘MyMedicine[]’ отсутствуют следующие свойства из типа ‘MyMedicine’: _id, имя, количество, время»
Ответ №1:
Как мы уже говорили вам в комментариях выше, проблема в том, что вы получаете из this.medService.postMed
массива MyMedicine
.
Одним из решений является добавление только последнего элемента из полученного массива.
medicines: MyMedicines[];
this.medService.postMed(newMedicine).subscribe(medicines => this.medicines.push(medicines.pop()))
Комментарии:
1. Спасибо @Emilien. Теперь ошибки нет, но ничего не обновляется в БД. Я протестировал свой API в Postman, и он работает.
Ответ №2:
Поскольку HTTP-запрос post возвращает только недавно добавленный элемент в массив MyMedicines [], измените метод postMed, как показано ниже:
postMed(newMed): Observable<MyMedicine>{
var headers = new HttpHeaders();
headers.append('Content-Type', 'application/json');
return this.http.post<MyMedicine>(`${this.url}/api/medicine`, newMed, {headers:headers});
а затем в классе component используйте наблюдаемый, который выдается HTTP post запросом, как показано ниже :
addmedicine(){
const newMedicine = {
name: this.name,
quantity: this.quantity,
time: this.time
};
this.medService.postMed(newMedicine)
.subscribe((medicine : MyMedicine) =>{
this.medicines.push(medicine);
})}
Пожалуйста, проверьте со своей стороны, работает ли он.