使用graphQL,我们说我的查询是
{
client(clientId: 1) {
clientId
address
DoB
}
}
这将返回userId为1的用户的clientId
,address
和DoB
。在定义解析此查询的函数时,我查询我的数据库(DynamoDb)。当我查询dynamo时,我可以指定要返回的属性。但是,截至目前,我无法通过graphQL告诉我原始查询包含哪些属性。是否可以访问包含原始查询变量(clientId,address和DoB)的对象,然后我可以将其传递给dynamo查询?显然,这样做可以减少网络负载,并使API更具动态性。
现在正在发生的事情的逻辑:
客户说API,返回{clientId,地址,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,address,DoB}
让我知道是否有人知道graphQL是否可以内在地执行此操作。否则,我将不得不构建一个包装函数。
答案 0 :(得分:0)
这对我很重要,因为表中的某些列包含很多很少需要读取的数据。另外,免责声明-这可能是Apollo特有的,因为这就是我正在使用的内容。不知道我在做什么是否在GraphQL规范中。
这是我采用的方法:
selections
中抽出info
进行查询。const { selections } = info.fieldNodes[0].selectionSet;
ExpressionAttributeNames
和ProjectionExpression
。 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(',');
}
ExpressionAttributeNames
和ProjectionExpression
以及其他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;