【问题标题】:Decoding Json/Reading Errors in ReasonML在 ReasonML 中解码 Json/读取错误
【发布时间】:2018-09-26 01:02:02
【问题描述】:

我从 aws 的 appsync 服务返回了一个 graphql 查询。 这是查询返回的 json。

https://github.com/idkjs/reason-apollo-question/blob/600584c454ffb2efd08b8e42e3adca0eb151ba60/scratch/persons.json#L1-L27

    {
  "data": {
    "listPeople": {
      "items": [
        {
          "age": 23,
          "id": "123",
          "name": "BobTest",
          "__typename": "Person"
        },
        {
          "age": 24,
          "id": "124",
          "name": "JoeTest",
          "__typename": "Person"
        },
        {
          "age": 25,
          "id": "125",
          "name": "JimTest",
          "__typename": "Person"
        }
      ],
      "__typename": "PersonConnection"
    }
  }
}

这就是登录到控制台的样子。

这是 apollo-dev-tools 中的查询响应:

访问items 数组时出错。

尝试通过运行将items 值记录到控制台 https://github.com/idkjs/reason-apollo-question/blob/d38e7fbc33f02ab718c7227958d88f02adba1696/src/Persons.re#L66-L70

| Data(response) =>
               Js.log(response##listPeople);
               let listPeople = response##listPeople;
               let items = response##listPeople##items;
Js.log(items);

产生这个错误:

      We've found a bug for you!
  /Users/prisc_000/code/REASON/APOLLO/reason-apollo-question/src/Persons.re 69:32-51

  67 ┆ Js.log(response##listPeople);
  68 ┆ let listPeople = response##listPeople;
  69 ┆ let items = response##listPeople##items;
  70 ┆ Js.log(items);
  71 ┆

  This has type:
    option({. "items": option(Js.Array.t(option(
      {. "age": int, "id": string, "name":  string})))
      })

   But somewhere wanted:
    Js.t('a)

    ninja: build stopped: subcommand failed.
    >>>> Finish compiling(exit: 1)

如何解决此类型错误?

谢谢!

【问题讨论】:

    标签: graphql reason bucklescript


    【解决方案1】:

    您似乎将response##listPeople 定义为一个选项,因此您不能直接在其上调用response##listPeople##items。在从中读取 items 之前,您应该对 response##listPeople 进行模式匹配。

    【讨论】:

      【解决方案2】:

      解决方案:

      https://github.com/idkjs/reason-apollo-question/blob/2924b1eb928cf0e4de57d5659c5da1bed4dd981c/src/Persons.re#L31-L33

      基本上,我还没有摸索 Some/None 变量。

      当您看到编译器告诉您它正在寻找上述错误中指出的选项时,您已经通过将值包装在 Some 中来获取该值(如果存在)。

      所以这个:

      let name = item##name;
      let id = item##id;
      let age = item##age;
      

      不得不改成这样:

      let name = Some(item##name);
      let id = Some(item##id);
      let age = Some(item##age);
      

      就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        相关资源
        最近更新 更多