MCa*_*Cam 6 amazon-web-services aws-lambda graphql aws-appsync amazon-neptune
我目前正在将 Aws Appsync、Aws Lambda 和 Aws Neptune 用于应用程序。我的 Lambda 函数使用 NodeJS 12。现在我的问题是当我进行突变并最终进行查询(我想确保突变是先工作)。例如:
当我运行此测试查询以添加帖子时,出现以下数据为空的错误:addPost测试查询和结果
在 gremlin 中添加顶点是否返回数据/对象?如果是这样,我如何为我的 appsync graphql api 获取适当的 JSON 格式?我一直在阅读实用小精灵并在网上搜索,但没有运气。先感谢您。
您看到的情况很可能与 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 的前端执行此操作,情况会有所不同,因为同时允许其他进程是有意义的。
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |