繁体   English   中英

如何在没有笨拙的字符串操作的情况下从节点js查询GraphQl端点?

[英]How do I query a GraphQl endpoint from node js without clunky string manipulation?

我一直在寻找查询graphQl端点的方法,但到目前为止,它们都具有与我非常相似且笨拙的解决方案:字符串构建。 这里有一些链接:

  1. 用节点查询graphql
  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端点? 是否有任何工具/建议可以使这种交互更加面向对象?

使用官方教程中所示的变量

可以使用变量对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可以是整数或字符串。 输入对象类型也将被解析和适当处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM