当前位置: 首页 > 知识库问答 >
问题:

将AWS Appsync与AWS Neptune一起使用

岳浩宕
2023-03-14

我目前正在使用Aws Appsync、Aws Lambda和Aws Neptune作为应用程序。我的Lambda函数使用NodeJS 12。现在我的问题是,当我执行一个变异并最终执行一个查询时,从Neptune(更具体地说是gremlin)那里为我的graphql api(appsync)获取适当的JSON格式(我想确保变异首先起作用)。例如:

  1. 这是我的图ql模式的Post类型,上面有addPost突变:Post模式
  2. addPost突变映射到这个解析器:后突变解析器
  3. 然后运行这段代码:Lambda Code

当我运行这个测试查询来添加帖子时,我得到以下错误,数据为null:addPost测试查询和结果

在gremlin中添加顶点是否返回数据/对象?如果是,如何为我的appsync graphql api获取适当的JSON格式?我一直在阅读《实用小精灵》并在网上搜索,但运气不好。提前谢谢你。

共有1个答案

龙德润
2023-03-14

您看到的很可能与Lambda与节点的默认返回格式不兼容有关。js GLV。返回的默认格式是GraphSONV3,它类似于JSON,但不是格式良好的JSON。Lambda需要格式良好的JSON。在建立与海王星的连接时,可以更改mimetype以使用GraphSONV2,Lambda应该不会有任何问题。

const dc = new DriverRemoteConnection(
  `wss://<neptune-endpoint>:8182/gremlin`,
  { mimeType: "application/vnd.gremlin-v2.0+json" } 
);

另一件需要验证的事情是如何解决等待的Gremlin查询返回的promise。在示例代码中,您似乎将等待查询的结果输入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服务将在此时解析处理程序的promise。

FWIW,从Lambda支持的API层到Neptune使用async/wait几乎没有好处。Lambda函数和Neptune服务器端线程都将等待(并占用资源),直到所有promise都得到解决。在许多情况下,这只会增加仅使用同步调用的复杂性。如果您从长期运行的容器化应用程序或基于Web的前端执行此操作,情况会有所不同,在此期间让其他进程有意义。

 类似资料:
  • 问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分

  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做

  • 问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖

  • 问题内容: 当请求来自Ajax.ActionLink(使用Http方法发布)时,是否可以在控制器操作上使用ValidateAntiForgeryToken属性。替代方法似乎是手动滚动JQuery Ajax请求,但我很好奇MVC Ajax框架中是否有办法。 问题答案: 我还没看过。您必须将令牌放入POST中记录的数据中。每次都使用相同的防伪令牌ID(或名称,我不记得了),但是您必须非常小心,并确保您

  • 问题内容: 最近,我开始与路由器一起使用来构建应用程序。 我通常将use 用于依赖项和代码管理。但是,当我尝试包含包含语法的文件时会出现问题。 这就是我目前所拥有的: 如何将IndexComponent放在其自己的文件中并在此文件中调用它?我尝试了通常的方法(与骨干和反应相同),但是由于语法错误。 问题答案: 所以我自己弄清楚了。 我从此仓库获得了必要的文件和说明:jsx- requirejs-p

  • 所以我一定是错过了什么,我希望执行一个语句块,如果可选的存在,否则抛出异常。 如果不是null,则打印hellow world。如果是,则抛出运行时异常。

  • 我刚开始使用iText,我不知道XMLWorkerHelper类是如何工作的。我正在尝试创建一个方法,该方法接受包含html文档的字符串,将html转换为pdf文档,并将pdf作为字节数组返回。如果有人能指出下面代码中的错误,我将不胜感激。 我使用的代码如上所述。html代码位于变量articleString中。重要的部分是介于这两个系统之间。出来println语句。这是web应用程序和系统的一部

  • 我用嵌入ID(Integer和String字段在单独的类中)简单地初始化了类。我使用Spring数据(