我一直在寻找查询graphQl端点的方法,但是到目前为止,它们都具有与我非常相似且笨拙的解决方案:字符串构建。这里有一些链接:
最终,我现在正在运行的代码(并不是很喜欢)是:
// 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"
});
上面的代码存在问题:
似乎可以接受注入攻击
不是很好的类型检查
使用ENUMS麻烦,或进行类型转换(即,将日期设为字符串)
不是很可扩展。对于不同的迭代,必须复制很多粘贴相同的内容。
我对此并不陌生,并且天生不信任我的解决方案。
无论如何,如何在没有笨拙的字符串操作的情况下从节点js查询GraphQl端点?是否有任何工具/建议可以使这种交互更加面向对象?
答案 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可以是整数或字符串。输入对象类型也将被解析和适当处理。