在 type-graphql 突变中传递多个参数以及 `GraphQLUpload`

Posted

技术标签:

【中文标题】在 type-graphql 突变中传递多个参数以及 `GraphQLUpload`【英文标题】:passing multiple arguments along with `GraphQLUpload` in type-graphql mutations 【发布时间】:2021-11-10 08:43:21 【问题描述】:

我正在使用 type-graphql 实现上传照片的突变,我还想获得另一个参数,例如和 ID:

  @Mutation(() => GraphQLJSON)
  async userUploadPostPhoto(
    @Arg("photo", () => GraphQLUpload) photo: Upload,
    @Arg("id") id: string,
    @Ctx() context: TContext
  ) 
    return userUploadPostPhoto(photo, context);
  

这是我试图在邮递员中测试 API 的方法:

我从 API 得到的响应是这个 json 文件:


    "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?

【问题讨论】:

恕我直言map 是/应该仅用于文件...id 应该通过variables 传递,第二个对象编码到操作中 你能给我举个例子吗? github.com/jaydenseric/graphql-multipart-request-spec - 你应该已经编码了一个变量对象[文件 arg 为空] - operations 应该是 queryvariables 的数组 ... 像往常一样在突变 [或带参数的查询] typescript @Mutation(() => GraphQLUpload) async userUploadPostPhoto( @Arg("photo", () => GraphQLUpload) photo: Upload, @Arg("id") id: string, @Ctx() context: TContext ) return userUploadPostPhoto(photo, id, context); 这是我已经实现的突变,这是我在表单数据方法json "0": ["variables.photo"], "1": ["variables.id"] 中传递给突变的映射对象我想我正在做同样的事情在您附加的链接中提到 重新考虑...***.com/a/63607130/6124657 【参考方案1】:

你可以尝试使用Altair

我认为这比邮递员更好在这里你可以看到一个如何Upload a file whit altair的例子

您的 GraphQL 查询应如下所示

mutation ($Picture: Upload!)

  
  userUploadPostPhoto
  (
    id: 123123123,  
    photo: $Picture,
  )

【讨论】:

【参考方案2】:

我相信您将需要使用variables 对象来传递另一个输入,正如@xadm 所提到的。使用 Postman,我测试了以下代码并且它工作正常:


  "query": "mutation userUploadPostPhoto($photo: Upload!, $id: String!)  userUploadPostPhoto(photo: $photo, id: $id) ",
  "variables":  "photo": null, "id": "10" 

您也可以删除 photo 属性,因为它不是必需的。

PS:请确保您已经安装了graphql-uploadapollo-server-express。另一个包 (apollo-server) 将不接受 express 作为中间件作为applyMiddleware 方法的输入。

【讨论】:

以上是关于在 type-graphql 突变中传递多个参数以及 `GraphQLUpload`的主要内容,如果未能解决你的问题,请参考以下文章

type-Graphql 中的嵌套查询和变异

type-graphql 找不到模块“类验证器”异常

在 type-graphql 中传递 typescript type 问题

GraphQL - 参数未在突变中传递到后端

在反应中将道具作为graphql突变参数传递

GraphQL - 将枚举值作为参数直接传递给突变?