如何将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
相关产品推荐
相关产品推荐

