You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将RawQuery从AppSync传递至Lambda函数?

问题

我将AppSync用作基于NestJS Apollo Server的Lambda函数的GraphQL API。执行如下查询时:

query defaultSearch($accountId: String!) {
  defaultSearch(accountId: $accountId) {
    maxPrice
  }
}

AppSync传递给Lambda的事件内容为:

{
    "request": {
        "arguments": {
            "accountId": "SOMESTRING"
        },
        "info": {
            "fieldName": "defaultSearch",
            "parentTypeName": "Query",
            "variables": {
                "accountId": "SOMESTRING"
            }
        }
    }
}

这种格式无法将查询正确传递至Apollo Server,请问是否有办法获取类似以下内容的原始查询(RawQuery):

"query {\n  defaultSearch(accountId: \"SOMESTRING\") {\n    maxPrice\n  }\n}"

解决方案

方法一:通过请求映射模板注入原始查询

在AppSync配置Lambda数据源时,修改请求映射模板,将原始查询字符串直接添加到传递给Lambda的事件中。使用VTL模板实现:

{
  "version": "2018-05-29",
  "arguments": $utils.toJson($context.arguments),
  "info": $utils.toJson($context.info),
  "rawQuery": "$context.request.queryString"
}

配置完成后,Lambda事件里会新增rawQuery字段,直接包含用户提交的原始GraphQL查询字符串。

方法二:利用现有事件字段构造原始查询

如果无法修改AppSync配置,可以通过Lambda事件中已有的info字段信息手动拼接出原始查询。示例代码(JavaScript):

function buildRawQuery(event) {
  const { fieldName, variables, selectionSetGraphQL } = event.request.info;
  // 生成变量定义部分
  const variableDefinitions = Object.entries(variables)
    .map(([name, val]) => {
      // 根据实际变量类型调整,此处为简单示例
      const type = typeof val === 'string' ? 'String!' : typeof val === 'number' ? 'Float!' : 'ID!';
      return `$${name}: ${type}`;
    })
    .join(', ');
  // 生成变量赋值部分
  const variableAssignments = Object.entries(variables)
    .map(([name, val]) => `${name}: ${JSON.stringify(val)}`)
    .join(', ');
  // 拼接完整查询
  return `query ${fieldName}(${variableDefinitions}) {
  ${fieldName}(${variableAssignments}) {
    ${selectionSetGraphQL}
  }
}`;
}

调用该函数即可得到与原始查询结构一致的字符串。

内容的提问来源于stack exchange,提问作者Feras Allaou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:33:25