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

时间:2019-08-22 16:51:43

标签: javascript node.js graphql

我一直在寻找查询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端点?是否有任何工具/建议可以使这种交互更加面向对象?

1 个答案:

答案 0 :(得分:1)

使用variables,如official tutorial所示。

  

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

一个例子:

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