当前位置: 首页 > 知识库问答 >
问题:

从解析器内部获取完整的查询字符串

段干祺
2023-03-14

我是新来的nodejs和阿波罗服务器,所以不要评判我。

这个问题听起来和标题完全一样:“如何在解析器函数中获取graphql字符串?”。

实际上,每个解析器中都有四个参数:parent、args、context和info。这里有一些信息:https://www.apollographql.com/docs/apollo-server/essentials/data#type-签名

我决定编写一个函数,它在上下文中收集嵌套对象以重新生成查询字符串。为什么我需要它?好问题。我正在编写微服务,所以当我对当前微服务之外的字段进行嵌套查询时,我通过http传递查询。

我的解析器:

eventByID: async (root, args, context) => {
const event = await EventModel.findById(root.id);
event.creator = await nestedContextProvider(context, 'creator', event.creator);
return eventFascade(event); //just fascade for object - nothing serious

},

它引用嵌套上下文解决嵌套上下文:

const nestedQueryTraverser = (nestedQueryArray) => {
const nestedQueryTraversed = nestedQueryArray.selectionSet.selections.map(element => (
element.selectionSet === undefined
  ? element.name.value
  : `${element.name.value}{${nestedQueryTraverser(element)}}`));
return nestedQueryTraversed;
};

const nestedContextProvider = async (context, checkField, ID) => {
if (context.operation.selectionSet.selections[0].selectionSet.selections
.find(selector => selector.name.value === checkField)) {
let nestedFieldsArr = context.operation.selectionSet.selections[0]
  .selectionSet.selections.find(selector => selector.name.value === checkField);
nestedFieldsArr = nestedQueryTraverser(nestedFieldsArr);
const a = (await users(ID, nestedFieldsArr));
return a.data.usersByIDs[0];
}
return ID;
};

这对我来说很有效,但我知道一定有更好的解决办法。

有什么想法吗?

共有1个答案

谭志用
2023-03-14

graphql包包含一个print函数,该函数接受任何AST并返回字符串表示形式,因此您可以执行如下操作:

const { print } = require('graphql')

function anyResolver (parent, args, context, info) {
  const operationString = print(info.operation)
  // Fragments are not included in the operation, but we still need to print
  // them otherwise our document will reference non-existing fragments
  const fragmentsString = Object.keys(info.fragments)
    .map(fragmentName => print(info.fragments[fragmentName]))
    .join('\n\n')
  const documentString = `${operationString}\n\n${fragmentsString}`
}
 类似资料:
  • 问题内容: 有没有办法获取包含页面中用于请求当前页面的整个URL,包括锚点(#后面的文本-我可能使用了错误的单词)? 即页面foo.php包含在bar.php中。如果我在foo.php中使用您的解决方案,则需要说出bar.php?blarg = a#blahblahblah 问题答案: 不,恐怕不会,因为哈希( 包括 #的字符串)永远不会传递到服务器,因此它仅仅是浏览器的行为属性。该变量将包含其余

  • 我在Firebase中有一个包含多个记录的集合,每个记录都包含一个名称和记录的“关键字”的字符串数组。下面的示例。

  • 问题内容: Java的e.printStackTrace()不会打印内部异常的堆栈跟踪的所有详细信息。 有没有现成的方法来生成字符串形式的完整堆栈跟踪?(除了自己格式化外) 编辑 我刚刚发现printStackTrace()的作用-显然,它过滤掉的堆栈帧正是内部异常和外部异常共同的帧。因此,实际上这是我想要的,而不是“完整”堆栈跟踪。 问题答案: 我最终滚动了自己的代码(我采用了Throwable

  • 问题内容: 我需要的是将URL 的值转换成变量,然后在jQuery代码中使用它: 有谁知道如何使用JavaScript或jQuery来获取该价值? 问题答案: 这就是你所需要的:) 以下代码将返回一个包含URL参数的JavaScript对象: 例如,如果您具有URL: 此代码将返回: 您可以执行以下操作:

  • 问题内容: 我需要从Hibernate查询中获取字符串,并稍后进行处理(因此无法使用来解决)。 我已经看过如何从HibernateCriteriaAPI(并非用于记录日志)中获取SQL,但是有了这种解决方法,我得到了SQL查询字符串,但是没有显示它显示’?’的参数值,有没有办法获得带有参数值的完整SQL字符串? 我的意思是,有了这种解决方案,我可以得到,但我需要得到… 有想法吗? 问题答案: 有一

  • 我在用Lucene。Net版本3.0。3. 下面是Lucene查询转换为字符串,带有字段键、值和容差。 我想把字符串值传递给Api,在那里我需要转换回Lucene查询。 我使用字段FirstName和LastName尝试了QueryParser和MultifieldQueryparser,但在传递时没有返回确切的查询。