简体   繁体   中英

Passing complex arguments to GraphQL mutations

I've been using GraphQL in a Node server using graphql-js, and GraphQL has shown to be an extremely valuable abstraction, but I'm running into an issue.

I often find myself needing to pass large structured objects as arguments to GraphQL mutations, using GraphQLInputObjectType . This would be fine, but GraphQL doesn't support the use of JSON notation :(. So I end up just sending a string containing the JSON, for the server to deal with.

const objectStr = JSON.stringify(object).replace(new RegExp("\"", "g"), "'")

graphQLClient(`{
    user: updateUser(someDataObject: "${objectStr}") {...}
}`)

But now I'm not benefiting at all from GraphQL!

I have a feeling I'm doing something wrong here. What is the GraphQL way of sending, say, signup form data, to a mutation?

The best way of doing this is to use input objects.

Essentially your request would look like:

/* Query */
mutation Update($input: UpdateUserInput!) {
    updateUser(input: $input) {
        changedUser {
            id
            username
        }
    }
}

/* Variables (as JSON) */
{
    "input": {
        "username": "elon@spacex.com",
        "password": "SuperSecretPassword"
    }
}

You would pass that into the content body of the payload in your POST request as this:

{
    "query": <GraphQL query from above as a string>,
    "variables": <JSON object from above>
}

If you want a deeper explanation, you can check out Scaphold's Docs for updating data to help you structure your API.

Hope this helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM