【问题标题】:jQuery AJAX calls are failing when devtools are opened打开 devtools 时 jQuery AJAX 调用失败
【发布时间】:2019-03-31 10:13:39
【问题描述】:

当我打开开发工具来监控 API 调用时,我们的应用程序中的 jQuery Ajax 调用失败。收到 500 内部错误。

如果我关闭开发工具窗口,它工作正常。

这发生在生产服务器上。在我的本地服务器中,这两种方式都可以正常工作。

我尝试通过启动 java profiler 在 chrome 中记录它正在工作。一旦我停止它就不起作用了。

当我阅读服务器日志时,它正在尝试验证令牌不匹配的 CSRF 令牌。它正在抛出异常。但是,为什么只有在打开调试窗口时才会发生此错误的困惑。

我的 Ajax 调用代码如下:

jQuery.ax=function(url, data, async, type, dataType, successfn, errorfn) {
    async = (async==null || async=="" || typeof(async)=="undefined")? "true" : async;
    type = (type==null || type=="" || typeof(type)=="undefined")? "post" : type;
    dataType = (dataType==null || dataType=="" || typeof(dataType)=="undefined")? "json" : dataType;
    data = (data==null || data=="" || typeof(data)=="undefined")? {"date": new Date().getTime()} : data;
    data.avoidCacheDate = new Date().getTime();
    data.AJAXREQUEST = true;
    $.ajax({
        type: type,
        beforeSend: function (request){
            getToken(request);
        },
        async: async,
        data: data,
        url: url,
        dataType: dataType,
        success: function(d){
            successfn(d);
        },
        error: function(e){
            errorfn(e);
        }
    });
};

【问题讨论】:

  • 我们很难说出原因。那么生产服务器上的错误是什么?你看过日志吗?
  • 生产服务器是指你问ryt的中间件日志..

标签: javascript java jquery user-interface


【解决方案1】:

也许这是一个缓存问题?您的 200(良好)响应可能会被简单地缓存(您没有在示例代码中设置 cache: false 选项,默认情况下为 true)。 Chrome DevTools 在“网络”选项卡上有一个“禁用缓存”复选框。因此,当您打开 DevTools 时,您的请求会真正发送到服务器(并获得新的/实际的/真实的 500 响应)。

只需添加cache: false 以避免缓存,在解决问题之前您可能总是会得到 500。

PS:使用avoidCacheDate 数据字段作为缓存破坏器是不正确的,因为只有在“GET”请求的情况下data 才会被传递给查询字符串。对于其他(如 POST 或 PUT),它将转到请求有效负载。为此使用cache 选项。

【讨论】:

  • 您好 Roman86,感谢您的回复。总结一下,如果我在 ajax 请求中将缓存设置为 false,它总是会抛出 500 错误,直到我们解决问题。但是,如果我关闭开发工具窗口,我的 api 会为我返回数据。我是开发新手,向生产应用程序的请求添加缓存为 false 将是一个很好的方法?
  • 嗨@user3093856!在大多数情况下,使用“cache: false”是正确的方法,尤其是当您请求某个 API 端点并期望每个请求都有新数据时。缓存对于一些很少更改且不会影响应用程序工作的静态资产可能会很有用。关于关闭的 DevTools 没有错误 - 这很奇怪。如果您设置了“缓存:false” - 必须始终有新的响应(500?)。尝试在 ARC 中执行您的请求。或者(如果是 GET)只需在新选项卡中打开它,向 URL 添加一些随机参数
  • 罗马,我添加了缓存:false,标题:{“Cache-Control”:“no-cache”,“Pragma”:“No-cache”},但仍然是相同的行为。不知道会是什么问题。
  • @user3093856 让我们澄清一下 - 如果没有 DevTools 活动,它仍然返回 200? 500 只使用 DevTools?
  • @user3093856 是 GET 或 PUT 还是 POST 请求?您是否尝试在浏览器之外执行它?喜欢 ARC 或 Curl
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2014-05-14
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多