【发布时间】:2019-08-22 04:10:05
【问题描述】:
我正在将 VueJS 用于我正在构建的应用程序。我拥有的服务器是用 Golang 编写的,并且已设置为接受 CORS。在应用程序中,在我的一个组件searchBar 中,我已将其设置为在创建之前获取一些数据。
var searchBar = {
prop: [...],
data: function() {
return { ... };
},
beforeCreate: function() {
var searchBar = this;
axios.request({
url: '/graphql',
method: 'post',
data: {
'query': '{courses{id, name}}'
}
})
.then(function(response) {
searchBar.courses = response.data.data.courses;
});
},
methods: { ... },
template: `...`
};
Axios 在这里完美运行。它得到我需要的数据。 searchBar 有一个按钮,它会导致它发出一个事件,然后由另一个组件searchResults 拾取。收到事件后,searchResults 将获取一些数据。
var searchResults = {
data: function() {
return { ... }
},
mounted: function() {
var sr = this;
this.$bus.$on('poll-server', function(payload) {
var requestData = {
url: '/graphql',
method: 'post',
data: { ... },
...
};
...
axios.request(requestData)
.then(function(response) {
console.log(response);
}
);
});
},
template: `...`
};
请注意,我的 Axios 请求调用现在位于回调函数中。执行此调用时,我收到一个 CORS 错误:
从源“http://127.0.0.1:8080”访问“http://127.0.0.1:9000/graphql”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源上。
我的服务器位于http://127.0.0.1:9000,客户端位于http://127.0.0.1:8080。这是第二次请求调用的OPTIONS请求的内容。
为了比较,这里是第一个请求调用的请求标头(有效!)。
我已经将我的 Golang 服务器设置为通过 go-chi/cors 支持 CORS。就是这样设置的。
router := chi.NewRouter()
...
// Enable CORS.
cors := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
AllowedMethods: []string{"POST", "OPTIONS"},
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
ExposedHeaders: []string{"Link"},
AllowCredentials: true,
MaxAge: 300,
})
router.Use(
render.SetContentType(render.ContentTypeJSON),
middleware.Logger,
middleware.DefaultCompress,
middleware.StripSlashes,
middleware.Recoverer,
cors.Handler,
)
router.Post("/graphql", gqlServer.GraphQL())
return router, db
是什么导致了我遇到的错误以及如何解决?
【问题讨论】:
-
不熟悉 go-chi/cors,但您确定 CORS 设置正确吗?您的第一个 POST 请求很可能是正确的,但对于第二个 GET 请求却不是。该错误清楚地显示第二个 API 上没有 Allowed Origin 标头。
-
@colminator 我不小心留下了第二个请求的详细信息。第二个请求也是
POST请求。 -
请检查发送到服务器的
OPTIONS请求和响应,如果可以,请在此处发布 -
@BenYaakobi,我已将
OPTIONS请求添加到问题中。 -
@RejoanulAlam,是的,对于本地测试,不需要安全性。但是,最好将 dev/local 与生产中的内容相匹配。
标签: javascript go vue.js cors axios