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

时间:2017-05-02 20:54:56

标签: node.js amazon-dynamodb graphql

使用graphQL,我们说我的查询是

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

这将返回userId为1的用户的clientIdaddressDoB。在定义解析此查询的函数时,我查询我的数据库(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是否可以内在地执行此操作。否则,我将不得不构建一个包装函数。

1 个答案:

答案 0 :(得分:0)

这对我很重要,因为表中的某些列包含很多很少需要读取的数据。另外,免责声明-这可能是Apollo特有的,因为这就是我正在使用的内容。不知道我在做什么是否在GraphQL规范中。

这是我采用的方法:

  1. selections中抽出info进行查询。
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;