如何从 nodejs 中的另一个 lambda 调用 graphql lambda?

Posted

技术标签:

【中文标题】如何从 nodejs 中的另一个 lambda 调用 graphql lambda?【英文标题】:How can I call a graphql lambda from another lambda in nodejs? 【发布时间】:2020-09-15 06:33:29 【问题描述】:

我按照以下说明创建了 graphql lambda:https://www.apollographql.com/docs/apollo-server/deployment/lambda/ 它适用于 API 网关。但是,我需要从另一个 lambda 调用这个 lambda 函数。我想我需要将ApolloClient 放在另一个 lambda 函数中才能发送 graphql 请求。但是,它不起作用,因为我无法选择正确的链接来调用 lambda。 所以我正在寻找如何以编程方式构建 graphql 请求。我可以将请求作为事件发送以触发 graphql lambda。

有没有办法做到这一点?

例如,如果我有这样的突变请求:

 mutation sendMessage 
      sendMessage(text: "hello")
      text
    

我需要找到一种方法将请求转换为以下有效负载:

"id":"1","type":"start","payload":"variables":,"extensions":,"operationName":"sendMessage","query":"mutation sendMessage \\n  sendMessage(text: \\"hello\\") \\n    text\\n    __typename\\n  \\n\\n"

然后我将此有效负载发送到 graphql lambda 函数

【问题讨论】:

【参考方案1】:

您可以使用 graphQL 客户端通过 API 网关端点使用 HTTP 执行 graphQL 请求。

鉴于您有一个指向 graphQL 服务器的 API Gateway 端点,您可以从另一个 lambda 向该端点执行 graphQL 请求。

对服务器的 GraphQL 查询只是以某种方式格式化的常规 POST 请求。因此,如果您愿意,您可以使用任何服务器端 HTTP 客户端来执行该请求。但是,使用像 graphql-request 这样的库会更简单。

您可以使用graphql-request 包来执行服务器端的graphQL 请求。

import  request  from 'graphql-request'

const endpoint="https://your-api-gateway-endpoint";

const headers = 
  "x-api-key": 'api-gateway-key' // if your endpoint requires API key
;

const client = new GraphQLClient(endpoint,  headers );

const query = `
  mutation sendMessage 
      sendMessage(text: "hello")
      text
  
`;

const data = await client.request(query);
console.log(JSON.stringify(data, undefined, 2));

【讨论】:

我考虑过这个解决方案,但它会给请求带来更多延迟。它将请求发送到 API 网关,网关将其转发给不太好的 lambda。有没有办法在 lambda 中生成 graphql 请求负载,并直接发送给 graphql lambda? 我不认为使用 lambda 调用是一个好主意,即使它是可能的。由于您的客户端 lambda 将一直运行到您的服务器 lambda,您将为更高的 lambda 使用付费。延迟以毫秒为单位,所以我不会担心。

以上是关于如何从 nodejs 中的另一个 lambda 调用 graphql lambda?的主要内容,如果未能解决你的问题,请参考以下文章

如何从http调用获取调用者信息到c#中的另一个api

如何从同一网络中的另一台计算机访问我的 nodejs-express localhost 服务器?

使用nodejs中的AWS Lambda函数上传音频文件

NodeJS:从同一文件中的另一个函数内部调用函数

NodeJS - 从 S3 读取文件到 Lambda 中的 /tmp 文件夹

如何将数据推送到nodejs mongodb中的另一个模式