将 AWS Appsync 与 AWS Neptune 结合使用
Posted
技术标签:
【中文标题】将 AWS Appsync 与 AWS Neptune 结合使用【英文标题】:Using AWS Appsync with AWS Neptune 【发布时间】:2020-07-30 06:49:45 【问题描述】:我目前正在将 Aws Appsync、Aws Lambda 和 Aws Neptune 用于应用程序。我的 Lambda 函数使用 NodeJS 12。现在我的问题是当我进行突变并最终查询时从 Neptune(更具体地说是 gremlin)为我的 graphql api(appsync)取回适当的 JSON 格式(我想确保突变是先工作)。例如:
-
这是我的 graphql 架构的类型 Post,上面有 addPost 突变:
Post schema
addPost 突变映射到此解析器:Post Mutation Resolver
然后运行这段代码:Lambda Code
当我运行此测试查询以添加帖子时,我收到以下错误,数据为 null:addPost test query and result
在 gremlin 中添加顶点会返回数据/对象吗?如果是这样,我如何为我的 appsync graphql api 获取适当的 JSON 格式?我一直在阅读Practical Gremlin 并在网上搜索,但没有运气。提前谢谢你。
【问题讨论】:
【参考方案1】:您所看到的很可能与 Lambda 与 Node.js GLV 的默认返回格式不兼容有关。返回的默认格式是 GraphSONV3,它类似于 JSON,但不是格式良好的 JSON。 Lambda 期待格式良好的 JSON。您可以在建立与 Neptune 的连接时更改 mimetype,以使用 Lambda 应该没有任何问题的 GraphSONV2。
const dc = new DriverRemoteConnection(
`wss://<neptune-endpoint>:8182/gremlin`,
mimeType: "application/vnd.gremlin-v2.0+json"
);
要验证的另一件事是您如何解决等待 Gremlin 查询返回的承诺。看起来在您的示例代码中,您正在获取等待查询的结果并将其输入 JSON.stringify()。我认为这行不通,因为这将有效地返回 Promise 的 JSON 字符串化版本(这就是您所看到的)。在这种情况下(如果您想异步提交查询)您可以做的是获取您的 Gremlin 查询(或者甚至可能是这个更大的 case 语句)并将其放入 Lambda 处理程序之外的异步函数中。示例:
const gremlin = require('gremlin');
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const Graph = gremlin.structure.Graph;
const dc = new DriverRemoteConnection('wss://<neptune-endpoint>:8182/gremlin',
mimeType: "application/vnd.gremlin-v2.0+json"
);
const graph = new Graph();
const g = graph.traversal().withRemote(dc);
async function callNeptune()
const result = await g.addV('Post').property('userId','someid').
property('genre','somegenre').
property('caption','somecaption').
property('timestamp','sometimestamp').
toList();
console.log(result);
dc.close();
try
return result;
catch (error)
return error;
exports.handler = async (event) =>
const rawOutput = await callNeptune();
const jsonOutput = JSON.stringify(rawOutput);
const response =
statusCode: 200,
body: jsonOutput,
;
return response;
;
在这种情况下,您正在通过处理程序中的等待调用等待 Gremlin 查询的异步函数。因此,您可以从中获取结果并将其输入 JSON.Stringify() 并返回。 Lambda 服务将在此时解决处理程序的承诺。
FWIW,从 Lambda 支持的 API 层到 Neptune 使用 async/await 几乎没有什么好处。 Lambda 函数和 Neptune 服务器端线程都将等待(并占用资源),直到所有承诺都得到解决。在许多情况下,与仅使用同步调用相比,这只会增加复杂性。如果您是从长期运行的容器化应用程序或基于 Web 的前端执行此操作,情况会有所不同,同时让其他进程有意义。
【讨论】:
我现在仍然得到“null”作为响应。当我将 .toString 添加到遍历的末尾时,我得到“[object Promise]”的响应。 我编辑了我的回复,以包含一些关于在 Lambda 函数中使用 async/await 和 Gremlin GLV 的其他详细信息。通过尝试在 Lambda 处理程序中运行您的示例代码,我能够重现您的问题。通过将所有 Gremlin 查询拆分到另一个异步函数,我能够通过 JSON.stringify(result) 返回 Promise 的 JSON 表示来解决问题。 我复制了您的代码,但它仍然为我返回“null”。我尝试运行此查询:const result = await g.V().hasLabel('Post').toList();,假设 Post 顶点已添加并且我也被赋予 null。甚至尝试只返回 rawOutput 作为 body 的值,但也被赋予了 null。 另外,当我从查询末尾删除 .toList() 时,我收到此错误:"errorMessage": "Converting circular structure to JSON\n --> 从带有构造函数“GraphSON2Reader”的对象开始\n | 属性“_deserializers” -> 带有构造函数“Object”的对象\n | 属性“g:Traverser” -> 带有构造函数“TraverserSerializer”的对象\n --- 属性“读者'闭环”, Lambda 函数是否配置为在托管 Neptune 的同一 VPC 中运行? Neptune 集群的安全组是否设置为允许来自 Lambda 函数可以使用的任何可能的 IP 地址(Lambda 函数的 VPC 中定义的子网)的连接?以上是关于将 AWS Appsync 与 AWS Neptune 结合使用的主要内容,如果未能解决你的问题,请参考以下文章
在将 aws cdk 与 appsync 一起使用时,如何将突变添加到 graphql 架构并防止部署失败?
AWS AppSync 与 Firebase 作为 OpenID Connect 提供商
验证 Apollo 客户端以使 AppSync 与 @aws_subscribe 一起使用
将对象存储到数组中,而不在 AWS AppSync 架构中创建新表