【发布时间】:2020-05-23 19:51:55
【问题描述】:
如果我使用node-fetch 或curl 进行 GraphQL 查询,我会得到预期的结果。例如,如果我有一个带有以下代码的文件 gquery.js:
const fetch = require("node-fetch")
fetch('https://api.example.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-Api-Service-Key': '123456789077',
},
body: JSON.stringify({query: "query($fruitId: String!) { fruit(id: $fruitId) { id, name } }",
variables: { "fruitId": "ikttwwwbvn7" }})
})
.then(r => r.json())
.then(data => console.log('data returned:', data));
在我的 Ubuntu 机器上,我只需运行 $node gquery.js 即可返回结果。如果我使用普通卷曲,我也会得到结果,例如:
curl -H 'Content-Type: application/json' -X POST -H "X-Api-Service-Key: 123456789077" https://api.example.com/graphql -d '{ "query": "query($fruitId: String!) { fruit(id: $fruitId) { id, name } }", "variables": { "fruitId": "ikttwwwbvn7" }}'
但是,如果我只是在 Chrome 上使用 fetch,例如:
fetch('https://api.example.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-Api-Service-Key': '123456789077',
},
body: JSON.stringify({query: "query($fruitId: String!) { fruit(id: $fruitId) { id, name } }",
variables: { "fruitId": "ikttwwwbvn7" }})
})
.then(r => r.json())
.then(data => console.log('data returned:', data));
我收到一个错误:
CORS 策略已阻止从源“chrome-search://local-ntp”获取“https://api.example.com/graphql”的访问权限:对预检请求的响应未通过访问控制检查:没有“访问控制-请求的资源上存在 Allow-Origin' 标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
注意:我的端点实际上是不同的,但除此之外,此示例与我的示例基本相同。
我查看了related question,但答案似乎表明这不能仅在客户端解决。但我可以成功使用curl 和node 的事实告诉我,我只是没有正确的代码。
需要明确的是,我并不真正关心fetch。我很乐意使用任何不需要使用 apollo 或 relay 等客户端的独立 Javascript 解决方案。
【问题讨论】:
-
fetchAPI 正是您所寻找的。但是在浏览器中,您只是受到同源策略的限制,对此您无能为力。 -
node-fetch是基于服务器的(因为它是节点)。它不受 CORS 政策的约束,它可以为所欲为。fetch是相当于fetch的浏览器。问题是浏览器 JS 受 CORS 策略约束,除了从您必须托管的自己的代理服务器获取之外,无法绕过它。 -
谢谢,我正在寻找代码解决方案。我知道有像 relay 和 apollo 这样的 Javascript GraphQL 客户端,但我认为必须有一种方法可以在 JavaScript 中构造一个可以在浏览器上运行的简单查询。但如果答案是“这是不可能的,这就是为什么……”,我可以接受。我将更改我的问题以反映我想要实现的目标。
-
那些库将受到完全相同的限制。您需要修复服务器的 CORS 策略、在您的域上使用代理或其他方式。另外,您的 js 代码运行的环境究竟是什么? “origin 'chrome-search://local-ntp'”看起来很奇怪。
-
@Nagev“如何在 JavaScript 中进行简单的 GraphQL 查询”与您的原始问题不同。你在问什么,如何在浏览器中使用
JavaScript做一个GraphQL查询请求?或者如何解决您在尝试发出GraphQL请求时在浏览器中看到的CORS错误?
标签: javascript graphql