Mockjax动态模拟在' dataType="Script" '时停止工作

Mockjax dynamic mock stops working with `dataType="Script"`

本文关键字:quot Script 停止工作 dataType 动态 Mockjax 模拟      更新时间:2023-09-26

我有一个使用mockjax的动态模拟设置,它适用于我的大多数ajax请求,但当dataType设置为Script时失败,并让请求通过常规ajax处理程序。

// gets mocked
$.ajax({
    type: "GET",
    url: "http://myurl.com/myfile.js?_=1395314460347"
})
// does not get mocked!
$.ajax({
    type: "GET",
    dataType: "script",
    url: "http://myurl.com/myfile.js?_=1395314460347"
})

如何在mockjax中配置动态mock来拦截dataType设置的请求?


更新:mockjax定义示例代码

我正在创建动态模拟,所以我通过函数定义,而不是普通对象,像这样…

$.mockjax(function(settings) {
  // settings.url == '/restful/<service>'
  var service = settings.url.match(/'/restful'/(.*)$/);
  if ( service ) {
    return {
      proxy: '/mocks/' + service[1] + '.json',
      // handle `dataType: 'script'`
      dataType: 'application/javascript'
    };
  }
  return;
});

这似乎是Mockjax处理跨域脚本请求的错误。它没有做任何特别的事情来检测跨域请求(就像它对JSONP所做的那样),因此,当它将请求传递回原始的$.ajax方法时- jQuery从不使用Mockjax提供的模拟XHR对象。

所以本质上,Mockjax是拦截请求,然后把它传递给jQuery,它失败了。

我在这里打开了一个问题,所以这可以修复:https://github.com/appendto/jquery-mockjax/issues/136

同时你有两个选择。如果您想快速修补mockjax,请将这一行添加到471:

origSettings.crossDomain = false;

完成后,该部分看起来像这样:

mockHandler.cache = requestSettings.cache;
mockHandler.timeout = requestSettings.timeout;
mockHandler.global = requestSettings.global;
origSettings.crossDomain = false;
copyUrlParameters(mockHandler, origSettings);

另一种选择(我不建议)是将crossDomain: false添加到实际的AJAX请求中。我不建议这样做,因为在以后删除mock时需要删除这一行。

感谢@Nicholas Cloud给我发短信,让我注意到这个问题。

是否在模拟端点中设置dataType属性 ?

见:https://github.com/appendto/jquery-mockjax数据类型

如果是,您是否尝试将模拟数据类型设置为application/javascript ?

$.mockjax({
    type: "GET",
    dataType: "application/javascript",
    url: "myfile.js?_=1395314460347",
    responseText: "(function () { alert('hello world!'); }());"
});
$.ajax({
    type: "GET",
    dataType: "script",
    url: "myfile.js?_=1395314460347"
});