当前位置: 首页 > 工具软件 > koa-proxy > 使用案例 >

Koa-cors throw后不带跨域cors头踩坑记录

毋宪
2023-12-01

情景

使用fetch api跨域请求node + koa服务

关于fetch api 

引用MDN文档的描述

  • 当接收到一个代表错误的 HTTP 状态码时,从 fetch() 返回的 Promise 不会被标记为 reject, 即使响应的 HTTP 状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。

现象

在实际自己搭建node + koa服务,进行跨域请求时时发现:

如果服务主动throw抛出异常,则fetch会标记为reject,表示请求被阻止。

如下服务端controller代码

async function(ctx){
    throw new Error('服务器错误');
    //或者直接 ctx.throw(504, '服务器错误');
};

那么按照fetch api描述,此类服务端抛出错误的情况下,fetch应当resolve。

仅设置  ctx.status = 500; 的情况下,则fetch能被resolve

定位

koa-cors 跨域插件导致,若主动通过throw报错,则返回头中没有cors信息,导致fetch进入cors报错,表示请求被浏览器阻止。

控制台报错现象为: 
Access to fetch at 'http://localhost:8080/postTestData?type=post%20param' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

参考资料

  1. KOA ctx.throw 会清空headers 导致cors请求失败
 类似资料: