对 CORS 服务器的 Axios DELETE 调用在预检 OPTIONS 调用上触发承诺解析

Posted

技术标签:

【中文标题】对 CORS 服务器的 Axios DELETE 调用在预检 OPTIONS 调用上触发承诺解析【英文标题】:Axios DELETE call to CORS server triggers promise resolve on preflight OPTIONS call 【发布时间】:2020-03-22 02:33:38 【问题描述】:

我有一个带有 CORS 设置的 API,以允许来自特定来源的任何方法和标头。使用 axios,我正在尝试对服务器进行并发 DELETE 调用,然后在完成所有删除调用后重新加载所有数据,例如

//module ajax;
const deleteAsset = function(id) 
    return axios.delete('/api/Asset/' + id);
;

const getAllAssets = function() 
    return axios.get('/api/Asset/');
;


//module data
...
Promise.all(ids.map(id =>  ajax.deleteAsset(id); ))
    .then(() =>  ajax.getAllAssets(); );

我发现的问题是,由于预检 OPTIONS 请求,承诺在 OPTIONS 请求返回后解决,而不是等待 DELETE 请求(因此在服务器上发生删除之前重新加载数据)。

有什么方法可以防止这种情况发生,并且只解决 DELETE 请求上的承诺?

【问题讨论】:

【参考方案1】:

您对 OPTIONS 的解释不正确。不同步是因为你的代码。

你应该 => ajax.deleteAsset(id)=> return ajax.deleteAsset(id) 。在您的情况下,您没有返回对 map 的承诺,因此您无法同步您的承诺。

您可以在下面console.log dfds 来验证它确实是一个包含Promise(而不是undefined)的数组

下面的代码应该允许您同步删除和“检索”

const dfds = ids.map(id => ajax.deleteAsset(id))
return Promise.all(dfds).then(_ => ajax.getAllAssets())

(与返回的替代)

const dfds = ids.map(id =>  return ajax.deleteAsset(id) )
return Promise.all(dfds).then(_ =>  return ajax.getAllAssets() )

【讨论】:

哦,杂种。壮观的失败就我而言。如果您不小心,会在箭头语法中显示一个陷阱...

以上是关于对 CORS 服务器的 Axios DELETE 调用在预检 OPTIONS 调用上触发承诺解析的主要内容,如果未能解决你的问题,请参考以下文章

由于 CORS 错误,Axios 调用被阻止

Vuex 模块 CORS 错误中的 Nuxtjs Axios

CORS 正在阻止 PUT、DELETE 和 POST 请求,但 GET 正在工作

Axios 前端到 Golang 后端 CORS 问题

React/Axios API 获取请求问题(CORS 和内部服务器错误 500)

如何在没有 CORS 错误的情况下使用 axios 对 Instagram 进行 api 调用