【问题标题】:How do I query a GraphQl endpoint from node js without clunky string manipulation?如何从节点 js 查询 GraphQl 端点而无需进行繁琐的字符串操作?
【发布时间】:2019-12-28 01:10:00
【问题描述】:

我已经四处寻找查询 graphQl 端点的方法,但到目前为止,他们都有一个与我非常相似且笨拙的解决方案:字符串构建。这里有几个链接:

  1. querying graphql with node
  2. https://blog.apollographql.com/4-simple-ways-to-call-a-graphql-api-a6807bcdb355
  3. https://www.npmjs.com/package/graphql-request

最终,我现在正在运行的代码(并不真正喜欢)是:

// replace anything that looks like this => %someVar
// with the value at vars[someVar]
function injectVars(query, vars) {
  return query.replace(/%([\d\w]+)/g, (_, varName) => {
    if (!vars.hasOwnProperty(varName)) {
      throw new Error(`Undefined variable: ${varName}`);
    }
    return vars[varName];
  });
}

// a query with the injection point "%userId"
const userQuery = `query getUser{
  user(
    id: "%userId"
  ) {
    id
    name
  }
}`;

// successful injection
const query = injectVars(userQuery, {
  userId: "some-id-123"
});
console.log(query);

// failed usage
const willFail = injectVars(userQuery, {
  nonVar: "missingUserId"
});

上面的代码有问题:

  1. 似乎容易受到注入攻击

  2. 不是很好的类型检查

  3. 使用 ENUMS 或类型转换有点麻烦(即获取日期并将其设为字符串)

  4. 不是很可扩展。必须为不同的迭代复制粘贴很多相同的东西。

  5. 我是新手,天生不相信我的解决方案。

无论如何,我如何从节点 js 查询 GraphQl 端点,而无需进行繁琐的字符串操作?是否有任何工具/建议可以使这种交互更加面向对象?

【问题讨论】:

    标签: javascript node.js graphql


    【解决方案1】:

    使用variables,如official tutorial所示。

    可以使用变量对 GraphQL 查询进行参数化,最大限度地重复使用查询,并避免在运行时在客户端中构建代价高昂的字符串...变量必须在操作的顶部定义,并且在该操作的整个执行过程中都在范围内。

    一个例子:

    const query = `query getUser($id: ID!) {
      user(
        id: $id
      ) {
        id
        name
      }
    }`
    const variables = {
      id: 'someId'
    }
    fetch('/graphql', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
      },
      body: JSON.stringify({
        query,
        variables,
      })
    })
    

    您提供的 JSON 值将被解析为您在文档中指定的类型(在上面的示例中,为 ID 标量)。这些变量将由 GraphQL 服务验证,因此您也可以跳过检查它们是否已定义或类型是否正确。只要变量被声明为枚举类型,字符串值就会被解析为适当的枚举值。 ID 可以是整数或字符串。输入对象类型也将被适当地解析和处理。

    【讨论】:

    • 我确实看到这对 1. 安全性和 3. 枚举有什么帮助,但它仍然缺少 2. 类型检查是运行时(低于标准)和 4. 这看起来会变得非常非常累对于具有 5 个或更多变量的函数。
    • 在不自己编写验证逻辑的情况下获得更好的类型检查的唯一方法是使用 typescript。 tools 用于从模式和查询生成类型。这将为您提供编译时类型检查。所以你的选择是:自己编写验证逻辑,让服务为你处理或切换到 TS。
    • 关于写出多个变量定义真的很“累”,请参阅this recent post
    • 唯一想到的其他解决方案是某种query builder,但变量是在 GraphQL 中处理动态输入的标准推荐方法。
    • 嗯.. 谢谢。查询生成器看起来最像我想象的那样。我想我可能需要一些时间来发挥创造力,看看我是否可以制作出具有我正在寻找的功能的东西。到目前为止,这些解决方案中的大多数看起来......它们在未来几年会得到很大改进。
    猜你喜欢
    • 2020-12-13
    • 2014-06-25
    • 2019-05-02
    • 1970-01-01
    • 2016-06-19
    • 2017-11-09
    • 2021-09-03
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多