我在我的网络服务器上使用apollo-client与我的graphql服务器(也是apollo)进行通信。我有一个成功的查询工作和正确检索数据,但当我尝试突变时,我收到new ApolloError
消息。相同的突变复制/粘贴到graphiql中可以很好地工作。
我在我的graphql服务器上检查了CORS,它已启用且运行正常。我已经将我的变异从代码中复制并粘贴到我的graphiql编辑器中,它按预期工作。
有人可以为我阐明这一点,或者指导我如何在graphql-server上查看有关为什么我收到400
错误的更多信息?
这是apollo错误
{
"graphQLErrors": [],
"networkError": {
"response": {
"url": "http://localhost:9000/api/private",
"status": 400,
"statusText": "Bad Request",
"headers": {
"_headers": {
"x-powered-by": [
"Express"
],
"access-control-allow-origin": [
"*"
],
"content-type": [
"application/json"
],
"date": [
"Wed, 22 Mar 2017 05:36:21 GMT"
],
"connection": [
"close"
],
"transfer-encoding": [
"chunked"
]
}
},
"ok": false,
"body": {
"_readableState": {
"objectMode": false,
"highWaterMark": 16384,
"buffer": {
"head": {
"data": {
"type": "Buffer",
"data": [
123,
34,
101,
114,
114,
111,
114,
115,
34,
58,
91,
123,
34,
109,
101,
115,
115,
97,
103,
101,
34,
58,
34,
67,
97,
110,
110,
111,
116,
32,
113,
117,
101,
114,
121,
32,
102,
105,
101,
108,
100,
32,
92,
34,
116,
111,
107,
101,
110,
92,
34,
32,
111,
110,
32,
116,
121,
112,
101,
32,
92,
34,
85,
115,
101,
114,
83,
101,
114,
118,
105,
99,
101,
115,
92,
34,
46,
34,
44,
34,
108,
111,
99,
97,
116,
105,
111,
110,
115,
34,
58,
91,
123,
34,
108,
105,
110,
101,
34,
58,
57,
44,
34,
99,
111,
108,
117,
109,
110,
34,
58,
55,
125,
93,
125,
93,
125
]
},
"next": null
},
"tail": {
"data": {
"type": "Buffer",
"data": [
123,
34,
101,
114,
114,
111,
114,
115,
34,
58,
91,
123,
34,
109,
101,
115,
115,
97,
103,
101,
34,
58,
34,
67,
97,
110,
110,
111,
116,
32,
113,
117,
101,
114,
121,
32,
102,
105,
101,
108,
100,
32,
92,
34,
116,
111,
107,
101,
110,
92,
34,
32,
111,
110,
32,
116,
121,
112,
101,
32,
92,
34,
85,
115,
101,
114,
83,
101,
114,
118,
105,
99,
101,
115,
92,
34,
46,
34,
44,
34,
108,
111,
99,
97,
116,
105,
111,
110,
115,
34,
58,
91,
123,
34,
108,
105,
110,
101,
34,
58,
57,
44,
34,
99,
111,
108,
117,
109,
110,
34,
58,
55,
125,
93,
125,
93,
125
]
},
"next": null
},
"length": 1
},
"length": 117,
"pipes": null,
"pipesCount": 0,
"flowing": null,
"ended": false,
"endEmitted": false,
"reading": true,
"sync": false,
"needReadable": true,
"emittedReadable": true,
"readableListening": false,
"resumeScheduled": false,
"defaultEncoding": "utf8",
"ranOut": false,
"awaitDrain": 0,
"readingMore": false,
"decoder": null,
"encoding": null
},
"readable": true,
"domain": null,
"_events": {},
"_eventsCount": 7,
"_writableState": {
"objectMode": false,
"highWaterMark": 16384,
"needDrain": false,
"ending": false,
"ended": false,
"finished": false,
"decodeStrings": true,
"defaultEncoding": "utf8",
"length": 0,
"writing": false,
"corked": 0,
"sync": false,
"bufferProcessing": false,
"writecb": null,
"writelen": 0,
"bufferedRequest": null,
"lastBufferedRequest": null,
"pendingcb": 0,
"prefinished": false,
"errorEmitted": false,
"bufferedRequestCount": 0,
"corkedRequestsFree": {
"next": null,
"entry": null
}
},
"writable": true,
"allowHalfOpen": true,
"_transformState": {
"needTransform": true,
"transforming": false,
"writecb": null,
"writechunk": null,
"writeencoding": "buffer"
}
},
"bodyUsed": false,
"size": 0,
"timeout": 0,
"_raw": [],
"_abort": false
}
},
"message": "Network error: Network request failed with status 400 - \"Bad Request\""
}
Error
at new ApolloError (/Users/rkstar/dev/projects/crate/microservices/dashboard/node_modules/apollo-client/apollo.umd.js:1490:23)
at /Users/rkstar/dev/projects/crate/microservices/dashboard/node_modules/apollo-client/apollo.umd.js:2149:24
at process._tickCallback (internal/process/next_tick.js:103:7)
****更新****
我在我的apolloMiddleware
之前添加了中间件到console.log req.headers和req.body
req.headers -------
{
"accept": "*/*",
"content-type": "application/json",
"authorization": "JWT ",
"accept-encoding": "gzip,deflate",
"user-agent": "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)",
"connection": "close",
"content-length": "585",
"host": "localhost:9000"
}
req.body -------
{
"query": "mutation updateTwitterAccessToken($data: TokenInput!) {\n updateTwitterToken(data: $data) {\n _id\n services {\n twitter {\n id\n __typename\n }\n token {\n token\n expires\n __typename\n }\n __typename\n }\n __typename\n }\n}\n",
"variables": {
"data": {
"accessToken": "000700000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"accessTokenSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"_id": "yyyyyyyyyyyyyyyyy",
"service": "twitter",
"serviceId": "000700000"
}
},
"operationName": "updateTwitterAccessToken"
}
我正在从我的网络服务器拨打client.mutate({ ... })
,但在req.body
这里,我设置了这个:
req.body -------
{
"query": "mutation ..."
....
}
为什么它是"query": "mutation ..."
而不是"mutation": "mutation ..."
?
答案 0 :(得分:1)
<强> TL; DR 强>
我解决了这个问题,这是因为我的update-token.graphql
文件有一个不正确嵌套的返回属性===错误。
好的...所以我解决了这个问题。这是我的graphql变异中的一个愚蠢的错误。我试图得到一个在另一个领域内不存在的领域。
我已将我的查询复制并粘贴到graphiql中,工作正常!我忘记的是,我没有嵌套我的一个返回变量,这使得一切变得不同。我以为我已将我的更改粘贴回.graphql
文件......但显然不是。
对此有什么兴趣是我最终弄清楚这个错误:
我尝试添加中间件来打印我的请求-------
router.all('/private',
bodyParser.json(),
(req, res, next)=>{
console.log(JSON.stringify(req.route, null, 2))
next()
},
apolloMiddleware
)
它向我展示了很多东西,但是在比较来自graphiql和apollo-client的请求时没有任何东西跳出来(可能是因为实际的查询是一个字符串而且没有像json那样格式化)
然后我终于遇到了formatError
,我能够打印出我的错误:
const apolloMiddleware: any = graphqlExpress(request => ({
debug: debugMode,
schema: executableSchema,
context: request,
formatError: e =>{
console.log(JSON.stringify(e, null, 2))
}
}))
并告诉我这个:
{
"message": "Cannot query field \"token\" on type \"UserServices\".",
"locations": [
{
"line": 9,
"column": 7
}
]
}
看到这条消息后,我立即更新了我的.graphql
文件并做了一个史诗般的facepalm,因为我看到突变按照预期通过apollo-client工作。