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