Удаление Javascript не запускает серверную часть Java

Я работаю над приложением с интерфейсом React и серверной частью Java (Spring boot). У меня есть кнопка на передней панели, которая должна удалить мою сущность. Когда я щелкаю по нему, он удаляет его из пользовательского интерфейса, но он все еще существует в серверной части. Когда я обновляю страницу, она снова появляется снова. Кто-нибудь заметил, что я делаю не так?

Обновлено: единственное место, где реагируют серверная часть и передняя часть, - это то, где у меня есть CrossOrigin в бэкэнде. Есть ли способ использовать это для каждого метода? Или мне даже не нужно этого делать? Кроме того, я считаю, что серверный API работает правильно. Все работает правильно при тестировании через почтальона, но ничего не запускается из интерфейса реакции.

Изменить 2: Допустим, я отправляю пиво через почтальона с идентификатором 3. Поэтому, когда я печатаю идентификатор в консоли функции удаления, он равен 3, но затем я получаю сообщение об ошибке DELETE http: // локальный: 3000 / api / homebrews / $% 7BbeerId% 7D / 404 (Не обнаружена). Почему он переводит идентификатор с 3 на $% 7BbeerId% 7D? Технически это одно и то же?

Homebrews.js

import * as React from 'react';
import './Homebrews.css';
import { Button, ButtonGroup, Container, Table } from 'reactstrap';

class Homebrews extends React.Component{

  constructor(props) {
    super(props);

    this.state = {
      beers: [],
      isLoading: false
    };

    this.remove = this.remove.bind(this);
  }

  componentDidMount() {
    this.setState({isLoading: true});

    fetch('http://localhost:8082/homebrews')
      .then(response => response.json())
      .then(data => this.setState({beers: data, isLoading: false}));
  }

  async remove(id) {
      await fetch('/homebrews/${id}', {
        method: 'DELETE',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        }
      }).then(() => {
        let updatedBeers = [...this.state.beers].filter(i => i.id !== id);
        this.setState({beers: updatedBeers});
      });
    }

  render() {
    const {beers, isLoading} = this.state;

    if (isLoading) {
      return <p>Loading...</p>;
    }

    return (
      <div className = "Brew-Data">
        <h2>Homebrew List</h2>
        {beers.map((beer: Homebrews) =>
        <div key = {beer.id} className = "Square">
          <div key = {beer.id} className = "Data">
            <h2>{beer.beerName}</h2>
            <Button size = "sm" color = "danger" onClick = {() => this.remove(beer.id)}>Delete</Button>
          </div>
        </div>
        )}
      </div>
    );
  }
}

export default Homebrews;

HomebrewController.java

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class HomebrewController {

@Autowired
private HomebrewService hbService;

@RequestMapping("/homebrews")
@CrossOrigin(origins = "http://localhost:3000")
public List<HomebrewBeer> getAllBeers() {
    return hbService.getAllBeers();
}

@RequestMapping("/homebrews/{id}")
public HomebrewBeer getBeer(@PathVariable String id) {
    return hbService.getBeer(id);
}

@RequestMapping(method = RequestMethod.POST, value = "/homebrews")
public void addBeer(@RequestBody HomebrewBeer beer) {
    hbService.addBeer(beer);
}

@RequestMapping(method = RequestMethod.PUT, value = "/homebrews/{id}")
public void updateBeer(@RequestBody HomebrewBeer beer, @PathVariable String id) {
    hbService.updateBeer(beer, id);
}

@RequestMapping(method = RequestMethod.DELETE, value = "/homebrews/{id}")
public void deleteBeer(@PathVariable String id) {
    hbService.deleteBeer(id);
}

HomebrewService.java

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class HomebrewService {

@Autowired
HomebrewRepository repository;

public List<HomebrewBeer> getAllBeers() {
    List<HomebrewBeer> beers = new ArrayList<HomebrewBeer>();
    repository.findAll().forEach(beers::add);
    return beers;
}

public HomebrewBeer getBeer(String id) {
    return repository.findOne(id);
}

public void addBeer(HomebrewBeer beer) {
    repository.save(beer);
}

public void updateBeer(HomebrewBeer beer, String id) {
    repository.save(beer);
}

public void deleteBeer(String id) {
    repository.delete(getBeer(id));
}
}

HomebrewRepository.java

import org.springframework.data.repository.CrudRepository;



public interface HomebrewRepository extends CrudRepository<HomebrewBeer, 
String> {

}

Homebrew.java

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class HomebrewBeer {

@Id
private String beerId;
private String beerName;
private String beerStyle;
private String description;
private Boolean usedOnlineRecipe;
private double abv, originalGravity, finalGravity, specificGravity;

public HomebrewBeer() {}

public HomebrewBeer(String beerId, String beerName, String beerStyle, Boolean 
usedOnlineRecipe, String description,
                    double abv, double originalGravity, double finalGravity, 
double specificGravity) {

    this.beerId = beerId;
    this.beerName = beerName;
    this.beerStyle = beerStyle;
    this.usedOnlineRecipe = usedOnlineRecipe;
    this.description = description;
    this.abv = abv;
    this.originalGravity = originalGravity;
    this.finalGravity = finalGravity;
    this.specificGravity = specificGravity;
}

public void setBeerId(String beerId) {
    this.beerId = beerId;
}

public void setBeerName(String beerName) { this.beerName = beerName; };

public void setBeerStyle(String beerStyle) {
    this.beerStyle = beerStyle;
}

public void setUsedOnlineRecipe(Boolean usedOnlineRecipe) {
    this.usedOnlineRecipe = usedOnlineRecipe;
}

public void setDescription(String description) {
    this.description = description;
}

public void setAbv(double abv) {
    this.abv = abv;
}

public void setOriginalGravity(double originalGravity) {
    this.originalGravity = originalGravity;
}

public void setFinalGravity(double finalGravity) {
    this.finalGravity = finalGravity;
}

public void setSpecificGravity(double specificGravity) {
    this.specificGravity = specificGravity;
}

public String getBeerId() {
    return beerId;
}

public String getBeerName() { return beerName; };

public String getBeerStyle() {
    return beerStyle;
}

public Boolean getUsedOnlineRecipe() {
    return usedOnlineRecipe;
}

public String getDescription() {
    return description;
}

public double getAbv() {
    return abv;
}
public double getOriginalGravity() {
    return originalGravity;
}

public double getFinalGravity() {
    return finalGravity;
}

public double getSpecificGravity() {
    return specificGravity;
}

Ваш серверный API успешно удаляет запись?

Hemadri Dasari 25.09.2018 05:26

можешь опубликовать урок домашнего пивоварения?

GSUgambit 25.09.2018 05:28

Также вы можете передать идентификатор функции удаления, вам не нужно передавать объект homebrew

GSUgambit 25.09.2018 05:29

1. Проверьте сеть браузера, он вызывает правильный URL-адрес API и возвращает 200. 2. Вам нужно отладить бэкэнд, правильно ли он работает, и удаление значения также. U необходимо определить @Transactional для слоя DAO, который удаляет данные.

Abdul 25.09.2018 06:32

Итак, мой backend API работает правильно, я тестировал его с помощью почтальона, и все в порядке. Но когда я пытаюсь удалить из внешнего интерфейса, это не работает. Я также сейчас опубликую урок Homebrew.

alexaggs 25.09.2018 14:08

Обновление: я изменил метод в js-файле с «DELETE» на «POST», и произошло то же самое. Это заставляет меня поверить, что что-то на самом деле может быть не так с моим backend api, хотя я не уверен.

alexaggs 25.09.2018 14:27

Вы пробовали использовать Fiddler? Это может помочь вам определить проблему (параметр не отправляется, ошибка 500 и т. д.)

Mo7 25.09.2018 19:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
7
141
1

Ответы 1

У вас неправильный синтаксис литералы шаблонов:

await fetch('/homebrews/${id}', {

Поэтому измените выше на:

await fetch(`/homebrews/${id}`, {

Я немного запутался, разве это не то, что у меня сейчас? Извините, просто пытаюсь уточнить!

alexaggs 25.09.2018 14:20

@alexaggs backquote - это `, так что это не то, что у вас сейчас. Однако я действительно не знаю, зачем вам это нужно, вероятно, проблема не в этом.

eis 25.09.2018 15:27

`/ homebrews / $ {id}`, обратите внимание на небольшую разницу в кавычках. Таким образом, параметры шаблона будут заменены. С одинарными кавычками этого не произойдет. Если вы зарегистрируете серверную часть входящего идентификатора, вы увидите, что это, вероятно, будет ${id}.

ChristopherS 25.09.2018 15:28

Другие вопросы по теме