React + Axios 双 POST 请求到 spring RestController(也在 fetch 中,似乎不是 OPTIONS)

IT技术 reactjs spring-boot post fetch axios
2021-04-29 14:45:13

我已经阅读了多篇关于类似问题的帖子,但我没有 CORS 问题(我不认为)并且我的网络选项卡没有显示从客户端发送的第二篇文章

我正在使用 Axios 并对我的前端客户端做出react,经过长时间的调试,我发现某些东西正在触发我的 RestController 方法,总是两次,总是大约两分钟(这是一个非常长的响应,有大量的数据)

网络选项卡不显示第二个POST,但是当从 Postman 运行时,一切都按预期工作(没有随机的双重调用)

轴:

showCurrent = (dateA, dateB) => {

    axios.post("api/allData", {
        params: {
            date_a: dateA,
            date_b: dateB
        }})
        //successful fetch
        .then(res => this.setState({
            Data: res.data,
            isLoading: false,
            showPage: true,
            home: false,
        }))
        .catch(function (error) {
            //handle errors here
            alert(error.message);
        })
};

和请求映射:

 @RequestMapping(value = "/allData", method = RequestMethod.POST)
 public @ResponseBody String allData(@RequestBody String req)  throws JsonProcessingException {

    CDate cDate = parseJSON(req);
    ObjectMapper objectMapper = new ObjectMapper();
    return objectMapper.writeValueAsString(DateRange.getDataForDateRange(date));
}

控制器类也有@RestController注解

因此,如果我在大约 2 分钟内运行查询,那就没问题了。但比这更长,控制器将被调用两次,一切都会变得混乱。

如果需要,我可以添加更多代码......只是不知道如何调查这个。

编辑:

在客户端和服务器端 Java 中添加了 Console.log in 方法。

    console.log("whaaat");
    axios.post("api/allContracts", {
        params: {
            date_a: dateA,
            date_b: dateB
        }}).....

whaaat 只会运行一次,而 post 将运行两次并且端点将触发两次......

编辑2:

什么..... 我还添加console.log()了从点击到获取的每一步。没有什么会触发两次,除了POST......

即使与本机reactfetch相同也会发生

showCurrent = (dateA, dateB) => {
    console.log("whaaat");
    let obj = {};
    let params = {};
    params.date_a = dateA;
    params.date_b = dateB;
    obj.params = params;

    this.setState({isLoading: true});

    fetch("api/allData", {
        method: 'POST',
        body: JSON.stringify(obj),
        mode: 'cors',
    }).then( res => {
        return res.json()
    }).then( data => {
        this.setState({
            Data: data,
            isLoading: false,
            showPage: true,
            home: false,
        })
    }).catch(error => {
        //handle errors here
        alert(error.message);
    });

编辑 3:仍然没有任何解决方案......我阅读了预检选项请求,但网络选项卡上没有这样的东西。我试图在不同的 RequestMapping 中处理 OPTION 请求,但那个 dosent 甚至被触发....

试图在服务器和客户端中设置大约 200 万秒的超时,但这似乎也没有做任何事情.. 邮递员没有这个问题,一切正常

1个回答

万一有人想知道这里充满绝望。听听,这完全是关于我的前端客户端中的代理...

经过几天的调试(带有非常具有误导性的错误消息),我发现一个线程在讨论 nginx 有时如何在存在代理的情况下重新尝试获取

proxy: {
        '/api': 'http://localhost:8080'
    }

删除它后,我收到了OPTIONS请求,正如预期的那样。

接下来,取啤酒。