i'm using apollo-client on my web server to communicate with my graphql server (also apollo). i have a successful query working and retrieving data properly, but when i attempt a mutation, i'm getting new ApolloError messages. the same mutation copy/pasted into graphiql works perfectly.
i have checked CORS on my graphql server and it is enabled and functioning properly. i've literally copied and pasted my mutation from the code into my graphiql editor and it works as expected.
can someone shed some light on this for me, or direct me to how i can see more information on my graphql-server about WHY i'm getting a 400 error?
here is the apollo error
{
"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)
**** UPDATE ****
i added middleware before my apolloMiddleware to console.log the req.headers and 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"
}
i'm calling client.mutate({ ... }) from my web server, but in the req.body here, i'm setting this:
req.body -------
{
"query": "mutation ..."
....
}
why is it "query": "mutation ..." and not "mutation": "mutation ..." ?