Javascript Chrome自动重新提交HTTP POST

Javascript Chrome自动重新提交HTTP POST,javascript,angularjs,google-chrome,Javascript,Angularjs,Google Chrome,我有一个angular 1.x应用程序正在向api发送HTTP POST。如果api处理请求的时间超过3-5秒,Chrome会在第一个请求完成之前提交第二个请求,导致api尝试处理同一请求两次 查看chrome开发工具,它只显示了一个请求,但wireshark清楚地显示了对同一端点的两个HTTP POST请求 到目前为止,我还无法找到有关这种行为的文档 有没有其他人遇到过这个问题,或者找到了关于如何控制它的任何信息 编辑以添加代码示例 带有ng click的HTML <span>&l

我有一个angular 1.x应用程序正在向api发送HTTP POST。如果api处理请求的时间超过3-5秒,Chrome会在第一个请求完成之前提交第二个请求,导致api尝试处理同一请求两次

查看chrome开发工具,它只显示了一个请求,但wireshark清楚地显示了对同一端点的两个HTTP POST请求

到目前为止,我还无法找到有关这种行为的文档

有没有其他人遇到过这个问题,或者找到了关于如何控制它的任何信息

编辑以添加代码示例

带有ng click的HTML

<span><i class="fa fa-refresh" ng-click="reSubmit(transaction.transId)"></i></span>
角服务函数

self.reSubmit = function(id) {
        return $http.post(API + '/remediation/reSubmit/', {
            transId: id
        });
    };
当前使用测试处理程序服务器端在节点中使用HapiJS,通过强制10秒延迟来导致问题

reSubmit = async function(request, reply) {
    console.log('test');
    setTimeout(function(){
        reply({message:"success"})
    }, 10000)
}
执行上述所有代码后,我们看到:

  • dev tools中的Chrome network选项卡显示了2个请求,以及使用http200成功的httpoptions请求和一个包含事务ID的预期负载的httppost
  • 控制台日志“测试”两次
  • Wireshark显示了HTTP选项和2个HTTP POST请求
  • 10秒后,chrome中的单个HTTP POST请求显示为成功,并显示成功消息
  • 编辑2-CORS处理

    这就是我们目前处理CORS和选项飞行前请求的方法:

    server.route({
            method: 'OPTIONS',
            path: '/{p*}',
            config: {
                handler: function(request, reply) {
                    var response = reply();
                    response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';
                    response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';
                    return response;
                },
                cors: true
            }
        });
    

    如果您看到它的跨域,第一个是CORS选项飞行前请求。iirc这些选项隐藏在Chrome中,但在Wireshark中是可见的。这些选项在Chrome和Wireshark中都是可见的,并且这些选项都被考虑在内。我看到了多个实际的POST请求,数据、内容类型、http方法都相应地设置了。选项请求被立即响应为http 200,然后http post发生,这需要5秒以上的时间,然后是另一个具有相同负载的http post。尝试增加超时?您控制API吗?如果您是这样做的,并且它位于不同的域中,则此问题表示由于飞行前检查请求,有两个帖子和一个选项。您需要结束来自API的飞行前检查请求以停止此问题。@我确实控制API,但如前所述,选项请求正在启动,并且正在工作。我收到1个选项请求和2个帖子请求。第二个POST在选项后接收,并且在第一个POST花费5秒左右的时间后接收。
    server.route({
            method: 'OPTIONS',
            path: '/{p*}',
            config: {
                handler: function(request, reply) {
                    var response = reply();
                    response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';
                    response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';
                    return response;
                },
                cors: true
            }
        });