I'm implementing a mutation for uploading photo with type-graphql, and I also want to get another argument like and ID:
@Mutation(() => GraphQLJSON)
async userUploadPostPhoto(
@Arg("photo", () => GraphQLUpload) photo: Upload,
@Arg("id") id: string,
@Ctx() context: TContext
) {
return userUploadPostPhoto(photo, context);
}
This is the methods that I'm trying to test the API in postman:
The response I'm getting from the API is this json file:
{
"errors": [
{
"message": "Variable \"$id\" got invalid value { resolve: [function], reject: [function], promise: {} }; String cannot represent a non string value: { resolve: [function], reject: [function], promise: {} }",
"locations": [
{
"line": 1,
"column": 47
}
],
"extensions": {
"code": "BAD_USER_INPUT",
"exception": {
"stacktrace": [
"GraphQLError: Variable \"$id\" got invalid value { resolve: [function], reject: [function], promise: {} }; String cannot represent a non string value: { resolve: [function], reject: [function], promise: {} }",
" at /home/ebaqeri/Projects/univarsity/server/node_modules/graphql/execution/values.js:116:15",
" at coerceInputValueImpl (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/utilities/coerceInputValue.js:131:9)",
" at coerceInputValueImpl (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/utilities/coerceInputValue.js:54:14)",
" at coerceInputValue (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/utilities/coerceInputValue.js:37:10)",
" at _loop (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/execution/values.js:109:69)",
" at coerceVariableValues (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/execution/values.js:121:16)",
" at getVariableValues (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/execution/values.js:50:19)",
" at buildExecutionContext (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/execution/execute.js:203:61)",
" at executeImpl (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/execution/execute.js:101:20)",
" at Object.execute (/home/ebaqeri/Projects/univarsity/server/node_modules/graphql/execution/execute.js:60:35)",
" at execute (/home/ebaqeri/Projects/univarsity/server/node_modules/apollo-server-core/src/requestPipeline.ts:480:20)",
" at Object.processGraphQLRequest (/home/ebaqeri/Projects/univarsity/server/node_modules/apollo-server-core/src/requestPipeline.ts:375:28)",
" at processTicksAndRejections (node:internal/process/task_queues:96:5)",
" at async processHTTPRequest (/home/ebaqeri/Projects/univarsity/server/node_modules/apollo-server-core/src/runHttpQuery.ts:331:24)"
]
}
}
}
]
}
`
Anyone has any Idea on this? Is this the problem from the API side or the problem is the method that I'm trying to fix it?
I believe you will need to use the variables
object to pass the other input, as @xadm mentioned. Using Postman, I tested the following code and it worked:
{
"query": "mutation userUploadPostPhoto($photo: Upload!, $id: String!) { userUploadPostPhoto(photo: $photo, id: $id) }",
"variables": { "photo": null, "id": "10" }
}
You can also remove the photo
property, since it's not needed.
PS: Please ensure that you have installed graphql-upload
and apollo-server-express
. Another package(apollo-server
) will not accept express as a middleware as an input to a applyMiddleware
method.