【发布时间】:2022-01-19 09:48:25
【问题描述】:
我正在尝试使用 axios 进行发布请求,以从我的前端 React 应用程序将图像上传到云端。我从下面的 axios 代码中收到此错误:
http://localhost:3000 已被 CORS 策略阻止:在预检响应中 Access-Control-Allow-Headers 不允许请求标头字段 x-access-token。
使用 axios,不起作用给我 cors 错误
await axios({
method: "POST",
url: "https://api.cloudinary.com/v1_1/******/image/upload/",
data: {
file: img,
upload_preset: "*****",
cloud_name: "****",
},
})
.then((res) => {
console.log("response");
console.log(res);
})
.catch((err) => console.log(err));
同时,当我使用相同的 api 请求使用 fetch 时,发布请求有效并且不会给我错误。有人知道为什么以及如何使用 axios 调用 api 吗?
const data = new FormData();
data.append("file", img);
data.append("upload_preset", "*****");
data.append("cloud_name", "*****");
await fetch(
" https://api.cloudinary.com/v1_1/****/image/upload/",
{
method: "post",
body: data,
}
)
.then((resp) => resp.json())
.then((data) => {
setUrlArray((prevState) => [...prevState, data.url]);
})
.catch((err) => console.log(err));
额外信息:我的上传预设未签名。
在进行 axios api 调用后也从控制台得到了这个
{
error: {
message: "Upload preset must be specified when using unsigned upload"
}
}
【问题讨论】:
-
我会检查您的开发工具中的标头,看看请求之间有什么不同。
-
Axios 使用
data属性,不body。见Request Config -
另一个区别是您的 Axios 请求发送的是 JSON,而您的
fetch()发送的是multipart/form-data。如果fetch()适合你,为什么不直接使用它而不是 Axios? -
我找到了。在其中一个 redux thunk 文件中,他们有 axios.interceptors.request.use(async function (config) { const token = await localStorage.getItem("messenger-token"); config.headers["x-access-token"] = 令牌;返回配置;});
-
多么奇怪的拦截器。
localStorage.getItem()是同步的,那里不需要await
标签: reactjs axios cors fetch cloudinary