Aws lambda 如何使用无服务器框架将AWS Lambda的查询请求发送到AppSync GraphQL API?

Aws lambda 如何使用无服务器框架将AWS Lambda的查询请求发送到AppSync GraphQL API?,aws-lambda,graphql,apollo-client,serverless,aws-appsync,Aws Lambda,Graphql,Apollo Client,Serverless,Aws Appsync,我一直遇到这样一个问题,即理解如何通过使用AWS Lambda以尽可能简单的方式将查询请求发送到某个AppSync GraphQL API(它具有API密钥验证模式) 我是一个初学者,因此我读了很多书,寻找有用的提示和教程来解释这一点,我最接近的解决方案是本教程:,它建议使用Apollo客户端。 我的第一个问题是,这是实现我的目标的最佳方法吗(使用Apollo Client+AWS Lambda向AppSync GraphQL API发送查询、修改)?如果没有,那么最好的做法/方式是什么 以下是

我一直遇到这样一个问题,即理解如何通过使用AWS Lambda以尽可能简单的方式将查询请求发送到某个AppSync GraphQL API(它具有API密钥验证模式

我是一个初学者,因此我读了很多书,寻找有用的提示和教程来解释这一点,我最接近的解决方案是本教程:,它建议使用Apollo客户端。 我的第一个问题是,这是实现我的目标的最佳方法吗(使用Apollo Client+AWS Lambda向AppSync GraphQL API发送查询、修改)?如果没有,那么最好的做法/方式是什么

以下是基于上述教程的当前代码:

const gql  = require('graphql-tag');
const AWSAppSyncClient = require('aws-appsync').default;
const AUTH_TYPE = require('aws-appsync-auth-link/lib/auth-link').AUTH_TYPE;
require('es6-promise').polyfill();
require('isomorphic-fetch');


module.exports.handler =  async function(event, context) {

    //console.log("before_client_setup");

    const client = new AWSAppSyncClient({
      url: '******',
      region: '******',
      auth: {
        type: AUTH_TYPE.API_KEY,
        apiKey:'******'
      },
      disableOffline: true
    });

    //console.log("before_gql_query");

    const query = gql`
      query listJobs {
        listJobs{
          items {
            id title employer datePosted location url
          }
        }
      }
    `;

   //console.log("before_client_call");

    client.hydrated().then(function (client) {
      //Now run a query

      //console.log("before_client_query");

        client.query({ query: query, fetchPolicy: 'network-only' })   //Uncomment for AWS Lambda
          .then(function logData(data) {
              console.log('results of query: ', data);
          })
          .catch(console.error);
    });
}

url、region、auth参数是硬编码的,只是为了测试它是否有效(我知道这不是最佳做法),但当我通过无服务器框架使用命令调用此函数时:
sls invoke-f streamFunction--stage stg
我在控制台中得到的结果是: null

预期结果(在使用Postman并传递正确的url和api密钥时得到):

CloudWatch日志也没有任何帮助,因为它们没有提供有用的洞察问题可能是什么。下面是它们被调用时的屏幕截图:


有什么建议吗?

好的,所以我认为主要的问题是因为我使用了以下语法:

client.hydrated().then(function (client) {

      client.query({ query: query, fetchPolicy: 'network-only' })   //Uncomment for AWS Lambda
      .then(function logData(data) {
          console.log('results of query: ', data);
      })
      .catch(console.error);
});
异步函数的内部,这是我的lambda。相反,应使用await关键字。以下是解决问题的全部代码:

const gql = require('graphql-tag');
const AWSAppSyncClient = require('aws-appsync').default;
const AUTH_TYPE = require('aws-appsync-auth-link/lib/auth-link').AUTH_TYPE;
require('es6-promise').polyfill();
require('isomorphic-fetch');
module.exports.handler = async function (event, context) {
  try {
    const appSyncClient = new AWSAppSyncClient(
      {
        url: '******',
        region: '******',
        auth: {
          type: AUTH_TYPE.API_KEY,
          apiKey: '******'
        },
        disableOffline: true
      },
      {
        defaultOptions: {
          query: {
            fetchPolicy: 'network-only',
            errorPolicy: 'all',
          },
        },
      }
    );  
    const query = await gql`
      query listJobs {
        listJobs{
          items {
            id title employer datePosted location url
          }
        }
      }
    `;
    const client = await appSyncClient.hydrated();
    const data =   await client.query({query});
    console.log(data);

  } catch (error) {
    return context.fail(error);
  }
  return context.succeed("success");
}
以下是CloudWatch的日志:


希望这有帮助:)

感谢您尝试AppSync!很高兴你找到了客户端设置。