对象数组 Apollo Server 并从 react 发布

Posted

技术标签:

【中文标题】对象数组 Apollo Server 并从 react 发布【英文标题】:Array of Objects Apollo Server and post from react 【发布时间】:2019-06-04 18:11:39 【问题描述】:

所以我试图弄清楚如何将一组对象从 POST 请求传递到 AWS lambda 上的 apollo 服务器。

我已经检查过了,但这不是同一个问题 Array of objects convert into object of objects when I use Apollo

post 请求如下所示...

    api.post('query',  query : `mutation saveNewItem(description: "$description", specials: $JSON.stringify(specials))name`)
// comment to get rid of silly scroll bar overlapping code

架构看起来像这样...

    const  gql  = require('apollo-server-lambda')

    const typeDefs = gql`
      type ShoppingItem 
        description: String
        specials: [Specials]
      

      input Specials 
        description: String
        price: String
        qty: String
        saved: String
      

  type Mutation 
    saveNewItem(description: String!, specials: [Specials]) : ShoppingItem
  
`

示例特价商品如下所示...

[ // Object One
description: "First One"
price: "1.00"
qty: "1" 
saved: "false"
, // Object two
description: "Second One"
price: "1.00"
qty: "1" 
saved: "false"
]

我目前得到的错误是......

'Error: The type of ShoppingItem.specials must be Output Type but got: [Specials].',
  'at assertValidSchema (/Users/me/Desktop/Projects/app/build/node_modules/graphql/type/validate.js:71:11)',

如果我将其更改为普通的“类型”,它会抱怨它不是输入类型。

我也浏览过 apollo 服务器文档,但不太明白我做错了什么?

请正如 Daniel 在 cmets 中提到的那样,虽然从技术上讲,给出的“重复”答案是正确的,但这里提供的信息质量更高,对面临问题的人有用(在我看来)

【问题讨论】:

这可能不是完全重复的,但是有很多这样的“输入到输出”和“输出到输入”的问题。这里只有两个(here 和 here)。正如这些线程中所述,您需要同时定义 inputtype -- 前者用于参数,后者用于实际查询响应。 谢谢丹尼尔,让我读一读,我可能有点累了。 我在这里的评论是 Apollo-server 与这些答案有点不同,尽管我试图弄清楚如何应用逻辑,正如你所说的那样它可以工作,我只是了解它。 我可以建议不要关闭它,因为您的解释比下面的解释要好得多。 【参考方案1】:

您只能将输入类型用于输入 (GraphQLInputObjectType),将对象类型用于输出 (GraphQLObjectType)。您同时使用Specials:作为ShoppingItem 中字段specials 的输出类型和突变参数specials 中的输入类型。为此,您需要两种类型。原因是输出类型(可以)具有解析器(在您的情况下,这实际上是从阿波罗服务器抽象出来的)。您必须创建两种不同的类型:

type ShoppingItem 
    description: String
    specials: [Specials]


type Specials 
    description: String
    price: String
    qty: String
    saved: String


input SpecialsDraft 
    description: String
    price: String
    qty: String
    saved: String


type Mutation 
    saveNewItem(description: String!, specials: [SpecialsDraft]) : ShoppingItem

【讨论】:

我真是个白痴,在上面的 cmets Daniel 之后,我真的很生气,给我两个滴答声,让我测试一下。谢谢。 对不起,我认为丹尼尔的反应很好,指向了正确的方向。发帖后才看到:( 所以我得到了预期的 SpecialsDraft 有对象,一秒钟只是检查我的代码。 好的,所以查询通过了(这是在 api 中记录事件主体:"\"query\":\"mutation saveNewItem(description:\\\"Something\\\ ",特价:[\\\"说明\\\\":\\\\"咕\\\\",\\"数量\\\\":\\\\"1\\\\",\\\\"价格\\\":\\\"1\\\",\\\"已保存\\\":false])name\"" 这给出了预期的名称找到字符串描述。我现在将其标记为正确,因为您已经回答了我提出的问题,非常感谢!

以上是关于对象数组 Apollo Server 并从 react 发布的主要内容,如果未能解决你的问题,请参考以下文章

Apollo-Server-Express 未收到上传对象

使用 ExpressJS 访问 Apollo Server 中的 Request 对象

当我使用 Apollo 时,对象数组转换为对象对象

预期 0 个参数,但得到 1 个。使用 typescript 并从 react-apollo 撰写

apollo (graphQL) - 如何在查询中发送对象数组

如何在 Apollo Server 中正确键入上下文对象?