【问题标题】:Axios - No 'Access-Control-Allow-Origin' - CORSAxios - 没有“访问控制允许来源” - CORS
【发布时间】:2020-11-26 23:56:33
【问题描述】:

我正在构建一个使用外部 API 的 javascript 应用程序。 为了获取数据,我使用 axios,但是每当我发出请求时,它都会返回一个 CORS 错误 - “没有 Access-Control-Allow-Origin 标头集”。 现在,一个临时的解决方案是在 API URL 前面添加一个第三方代理(例如https://cors-anywhere.herokuapp.com),它工作得很好,但我真的不想依赖第三方服务器并想在我自己的应用程序中处理它。

我已经尝试了几乎所有方法,但仍然无法正常工作。我使用 axios 响应拦截器将所需的标头附加到响应中,但它不起作用。

axios.interceptors.response.use(res => {
  res.headers['Access-Control-Allow-Origin'] = '*';
  res.headers['Access-Control-Allow-Credentials'] = 'true'
  res.headers['Access-Control-Request-Method'] = 'POST'
  return res;
})

我的 server.js 文件看起来像这样

const serveStatic = require('serve-static')
const path = require('path')
const cors = require('cors');

const app = express()

app.use('/', serveStatic(path.join(__dirname, '/dist')))
app.use(cors());

const port = process.env.PORT || 8080
app.listen(port, () => console.log("starting on port 8080"));

这个问题有什么解决办法吗?

【问题讨论】:

    标签: javascript api web axios cors


    【解决方案1】:

    尝试颠倒这两行:

    app.use(cors());
    app.use('/', serveStatic(path.join(__dirname, '/dist')));
    

    告诉我它是否有效

    顺便说一下你的拦截器没用,你可以去掉它:

    axios.interceptors.response.use(... 
    

    【讨论】:

    • 我倒转了行,但预检仍然被触发并给我一个 cors 错误,不幸的是。我删除了除其中一个之外的所有拦截器和公共标头,这就是我的 api-key 标头。
    • 尝试两件事:1) 将cors() 替换为cors({origin: true}) 2) 添加withCredentials: true(参见axios 文档github.com/axios/axios)。如果这两项工作中的一项,我将替换我上面的回复
    • 仍然没有...我不确定它是否重要,但 API 的实现包括一个 POST 请求(这实际上是返回一个 CORS 错误,因为它是第一个发送的请求)
    • with cors({origin: true}) 你可以检查 OPTIONS 请求或 POST 请求是否被阻塞。您能否在被阻止的请求中提供来自 Chrome 的请求和响应标头
    • POST 请求是一个阻塞请求,如果我没记错的话。尽管 OPTIONS 请求也不包含 Access-Cotrol-Allow-Origin 标头。
    猜你喜欢
    • 2019-09-16
    • 2016-06-27
    • 1970-01-01
    • 2018-08-10
    • 2018-03-19
    • 2020-04-18
    • 2017-04-16
    • 2019-02-09
    • 2016-06-02
    相关资源
    最近更新 更多