将 AWS Appsync 与 AWS Neptune 结合使用

MCa*_*Cam 6 amazon-web-services aws-lambda graphql aws-appsync amazon-neptune

我目前正在将 Aws Appsync、Aws Lambda 和 Aws Neptune 用于应用程序。我的 Lambda 函数使用 NodeJS 12。现在我的问题是当我进行突变并最终进行查询(我想确保突变是先工作)。例如:

  1. 这是我的graphql 模式的Post类型,它的正上方有addPost突变: Post schema
  2. addPost突变映射到该解析器:帖子突变解析器
  3. 然后运行这段代码:Lambda Code

当我运行此测试查询以添加帖子时,出现以下数据为空的错误:addPost测试查询和结果

在 gremlin 中添加顶点是否返回数据/对象?如果是这样,我如何为我的 appsync graphql api 获取适当的 JSON 格式?我一直在阅读实用小精灵并在网上搜索,但没有运气。先感谢您。

Tay*_*gan 4

您看到的情况很可能与 Lambda 与 Node.js GLV 的默认返回格式不兼容有关。返回的默认格式是 GraphSONV3,它类似于 JSON,但格式不正确。Lambda 需要格式良好的 JSON。您可以在建立与 Neptune 的连接时更改 mimetype 以使用 GraphSONV2,而 Lambda 不应有任何问题。

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

另一件需要验证的事情是如何解析等待的 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;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将通过处理程序中现在的等待调用使用 Gremlin 查询等待异步函数。因此,您可以从中获取结果并将其输入 JSON.Stringify() 并返回它。Lambda 服务将在此时解决处理程序的承诺。

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