fetch mode no-cors 的使用详解

8 min read

fetch函数是ES6新增的网络请求API,与传统的XMLHttpRequest相比,使用更加简洁方便。fetch函数使用promise来处理异步任务,但是在默认情况下,fetch函数只能发送跨域请求,不能发送同域请求。

为了解决这个问题,fetch函数提供了一个额外的选项,即"mode"选项,可以用来控制请求的模式。其中,"mode"选项有以下几个可用的值:

  • "same-origin":只允许发送同域请求,如果请求地址不是同源的,会抛出跨域错误。
  • "no-cors":只允许发送跨域请求,但是请求返回的数据会受到一些限制,如只能读取response的type和status属性,不能读取response的headers属性,而且不能使用response的json()、text()、blob()等方法解析返回的数据。

在使用"no-cors"模式时,fetch函数的response对象会变得非常受限制,这是因为浏览器实施了跨域安全策略,限制了对跨域请求返回的数据的访问。在这种情况下,只能通过判断response的type和status属性来确定请求是否成功,并且可以使用response的type属性来判断返回的数据类型,如"basic"表示返回的是纯文本,"cors"表示返回的是跨域请求。

以下是一个使用"no-cors"模式发送跨域请求的示例代码:

fetch('https://api.example.com/data', { mode: 'no-cors' })
  .then(response => {
    console.log(response.type); // "cors",表示返回的是跨域请求
    console.log(response.status); // 请求的状态码
    
    // 不能使用response的json()、text()、blob()等方法解析返回的数据
    // 但是可以通过判断response的type来确定返回的数据类型,如文本、json等
  })
  .catch(error => {
    console.log(error);
  });

需要注意的是,"no-cors"模式只适用于发送不带身份验证凭证的请求,如果需要发送带身份验证凭证的请求,需要使用"same-origin"或"cors"模式。另外,使用"no-cors"模式发送的请求,不会触发浏览器的CORS预检请求。

总的来说,"no-cors"模式适用于那些只关心请求是否成功,并不关心具体的返回数据的情况,如发送某些统计请求等。对于需要访问返回数据的场景,建议使用"same-origin"或"cors"模式。