【问题标题】:How do I pass a string to a GraphQL query when it's expecting an enum (Apollo Server)?当需要枚举(Apollo Server)时,如何将字符串传递给 GraphQL 查询?
【发布时间】:2020-09-21 01:43:23
【问题描述】:

我正在尝试在 KeystoneJS 应用程序中进行 GraphQL 查询,我需要确定是否存在某种类型的页面(如果存在该类型的页面,我不会创建它——我正在实现每个页面类型为单例)。我的想法是搜索所有具有where 条件的页面,并在其中传递我要创建的页面类型。

const PAGE_QUERY = `
    query allPages($where:PageWhereInput){
      allPages(where:$where) {
    pageType
  }
}
`;

export const doesPageTypeExist = async (query, articleType: string): Promise<boolean> => {
    const where = {
        pageType: articleType
    };
    const options = {
        skipAccessControl: false,
        variables: {
            where
        }
    };
    const { errors, data } = await query(allPages, options);
    if (errors) {
        log.error({ errors }, 'errors from GraphQL operation in Page list');
        throw new Error(errors.toString());
    } else {
        return data?.allPages.length !== 0;
    }
};

问题是我得到了错误

变量“$where”的值无效 { pageType: "page2" } at "where.pageType";预期类型 PagePageTypeType。

我知道错误来自哪里:它期待这些枚举之一

enum CondomPagePageTypeType {
 page1
 page2
 page3
 page4
}

我正在传递一个字符串,但我不知道如何传递我正在测试的值(来自 Keystone),除了作为字符串。

【问题讨论】:

    标签: graphql apollo apollo-server keystonejs


    【解决方案1】:

    枚举值在用作变量时总是被序列化为字符串,所以问题不在于枚举值是如何提交的。根据错误,问题在于$wherepageType 属性的值。看来pageType 的值实际上是对象{ pageType: "page2" } 而不是page2。换句话说,您的 variables 属性如下所示:

    {
      "where": {
        "pageType": {
          "pageType": "page2"
        }
      }
    }
    

    根据显示的代码,我猜测可能传递给doesPageTypeExistarticleType 参数实际上并不是其类型所指示的字符串。

    【讨论】:

    • 确实!我自己刚刚发现了这一点,并且正在返回删除问题!我正在传递一个我认为我正在传递一个字符串的对象。 ?‍♂️
    猜你喜欢
    • 2019-04-02
    • 2022-10-23
    • 2022-01-20
    • 2023-03-28
    • 2019-06-02
    • 2018-08-16
    • 2021-03-03
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多