gpt4 book ai didi

node.js - 是否可以在 graphQL 执行期间访问特定的查询变量?

转载 作者:搜寻专家 更新时间:2023-11-01 00:05:28 24 4
gpt4 key购买 nike

使用 graphQL,假设我的查询是

{
client(clientId: 1) {
clientId
address
DoB
}
}

这将返回 clientId 为 1 的用户的 clientIdaddressDoB。在定义解析此查询的函数时,我查询我的数据库 (DynamoDb)。当我查询 dynamo 时,我可以指定要返回哪些属性。但是,截至目前,我无法让 graphQL 告诉我原始查询包含哪些属性。是否可以访问包含原始查询变量(clientId、地址和 DoB)的对象,然后我可以将其传递给发电机查询?显然,这样做会减少网络负载并使 API 更加动态。

现在发生的事情的逻辑:

客户端对 API 说,返回 {clientId, address, DoB} -> API 对 Dynamo 说返回具有特定 clientId 的客户端的所有属性 -> Dynamo 返回所有属性 -> graphQL API 解析并仅返回 {clientId, address, DoB

我想要发生的事情的逻辑:

客户端告诉 API 返回 {clientId, address, DoB} -> API 告诉 Dynamo 返回 {clientId, address, DoB} -> Dynamo 返回 {clientId, address, DoB} -> graphQL API 解析并返回 {clientId,地址,DoB

如果有人知道 graphQL 是否可以从本质上做到这一点,请告诉我。否则,我将不得不构建一个包装函数。

最佳答案

这对我很重要,因为我表中的某些列包含大量很少需要读取的数据。另外,免责声明——这可能是 Apollo 特有的,因为那是我正在使用的。不确定我所做的是否符合 GraphQL 规范。

这是我采用的方法:

  1. info 中提取 selections 用于查询。
const { selections } = info.fieldNodes[0].selectionSet;
  1. 构建 ExpressionAttributeNamesProjectionExpression
  let ExpressionAttributeNames;
let ProjectionExpression;
if (selections) {
let current = 'a'.charCodeAt(0);
ExpressionAttributeNames = selections
.filter(s => !s.selectionSet) // Skip nested queries
.reduce((obj, { name }) => {
const key = '#' + String.fromCharCode(current++);
obj[key] = name.value;
return obj;
}, {});

ProjectionExpression = Object.keys(ExpressionAttributeNames).join(',');
}
  1. 传入 ExpressionAttributeNamesProjectionExpression 以及其他 DynamoDB 查询参数。为了完整起见,我将此包括在内 - 第 1 步和第 2 步是这个问题的核心。
  const params = {
ExpressionAttributeValues: {
':foo': foo
},
ExpressionAttributeNames,
KeyConditionExpression: 'foo = :foo',
ProjectionExpression,
TableName: table
};

const response = await db.query(params).promise();
return response.Items;

关于node.js - 是否可以在 graphQL 执行期间访问特定的查询变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43747060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com