【问题标题】:AWS appsync w/ Lambd function backend, GraphQL gives unexpected repsonce to QueryAWS appsync with/L​​ambda 函数后端,GraphQL 对 Query 给出意外响应
【发布时间】:2018-09-15 19:04:02
【问题描述】:

接下来的一切都在 AWS 控制台中。我的 lambda 函数定义了deletePost

case "deletePost":
   var id = event.arguments.id;
   callback(null, {id:-1,author:"me",title:"title"}); //note, regardless of what your args are right now it is returning id:-1
   break;

我的架构是

type Mutation {
   ...
   deletePost(id: ID!): Post!
}
type Post {
   id: ID!
   author: String!
   title: String
}

我的 graphiQL 查询是

mutation DeletePost{
 deletePost(id: 3){
  id
 }  
} 

由于某种原因,当我将 id 硬编码为 -1 时,它只是鹦鹉学舌 id=3 回到我身边?如果我要求在我的查询中返回作者或标题,我根本不会让他们回来。


更新完整的羔羊 fxn。只是随 aws appSync 文档提供的模板的略微修改版本。

exports.handler = (event, context, callback) => {
console.log("Received event {}", JSON.stringify(event, 3));
var posts = { //in memory array store (simulates DB)
    "1": {"id": "1", "title": "First book", "author": "Author1"},
    "2": {"id": "2", "title": "Second book", "author": "Author2"},
    "3": {"id": "3", "title": "Third book", "author": "Author3"},
    "4": {"id": "4", "title": "Fourth book", "author": "Author4"},
    "5": {"id": "5", "title": "Fifth book", "author": "Author5"} };

console.log("Got an Invoke Request: "+event.field);
switch(event.field) {
    case "getPost":
        var id = event.arguments.id;
        callback(null, posts[id]);
        break;
    case "updatePost":
        posts[event.arguments.id]=event.arguments;
        console.log(posts);
        callback(null, event.arguments);
        break;
    case "deletePost":
        var id = event.arguments.id;
        //delete posts[event.arguments.id];
        callback(null, {id:-1,author:"me",title:"tits"});
        break;
    case "allPosts":
        var values = [];
        for(var d in posts){
            values.push(posts[d]);
        }
        callback(null, values);
        break;
    case "addPost":
        var id = event.arguments.id;
        posts[id]=event.arguments;
        console.log(posts);
        callback(null, event.arguments);
        break;
    case "addPostErrorWithData":
        var id = event.arguments.id;
        var result = posts[id];
        // attached additional error information to the post
        result.errorMessage = 'Error with the mutation, data has changed';
        result.errorType = 'MUTATION_ERROR';
        callback(null, result);
        break;
    default:
        callback("Unknown field, unable to resolve" + event.field, null);
        break;
  }
};

解析器。大多数情况下只是直接传递数据。

#request mapping
{
    "version" : "2017-02-28",
    "operation": "Invoke",
    "payload": {
        "field": "addPost",
        "arguments":  $util.toJson($context.arguments)
    }
}
#responce mapping
$util.toJson($context.result)

【问题讨论】:

    标签: aws-lambda graphql aws-appsync


    【解决方案1】:

    如果不查看所有 Lambda 函数以及您的解析程序模板,很难知道。从上面的代码我猜你是从这个教程开始的:https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-lambda-resolvers.html

    假设您在响应模板中传回结果,例如 $util.toJson($context.result),那么问题很可能与您的 Lambda 函数中的回调结构有关

    let result = {"id" :-1, "author":"me", "title":"title"}
    callback(null, result);
    

    基本上,您需要传回一个结果对象,以便在 $context 对象中看到它,并将其转换为 GraphQL JSON 响应给调用者。

    【讨论】:

    • 该死的。我在 deletePost 解析器中有“addPost”。将所有这些功能隐藏在 AWS Web 控制台的各个随机位置真的很糟糕。希望他们都可以在 VSCode 的项目中的文件中。为什么回调将 null 作为第一个参数。是否将其作为不同的字段放在 $context 上?
    • 这是 Lambda 中 NodeJS 函数的处理程序生命周期的一部分,这是必要的,以便它具有函数调用的入口和出口点。您可以在此处阅读更多相关信息:docs.aws.amazon.com/lambda/latest/dg/…
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2020-07-10
    • 2020-11-30
    • 2019-05-03
    • 2022-12-08
    • 2020-11-12
    • 2023-02-06
    • 2022-11-13
    相关资源
    最近更新 更多