![](/img/trans.png)
[英]How do I call an asynchronous node.js function from within a GraphQL resolver requiring a return statement?
[英]How do I query a GraphQl endpoint from node js without clunky string manipulation?
我一直在寻找查询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端点? 是否有任何工具/建议可以使这种交互更加面向对象?
可以使用变量对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.