AWS appsync с бэкэнд-функцией Lambd, GraphQL дает неожиданный ответ на запрос

Все, что следует далее, находится в консоли AWS. Моя лямбда-функция определяет 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=3, когда я жестко запрограммировал идентификатор как -1? Если я прошу указать автора или название в моем запросе, я не получу их вообще.


Обновить полный барашек fxn. Просто слегка измененная версия шаблона, которая предоставляется с документацией aws appSync.

exports.handler = (event, context, callback) => {
console.info("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.info("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.info(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.info(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 Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
В этой статье мы рассмотрим, как включить доступ Java Lambda к экземпляру AWS RDS MySQL.
1
0
637
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трудно понять это, не увидев всю функцию Lambda, а также шаблоны преобразователя. Из приведенного выше кода я предполагаю, что вы использовали это руководство в качестве отправной точки: https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-lambda-resolvers.html

Предполагая, что вы передаете результат в шаблоне ответа, например $util.toJson($context.result), проблема, скорее всего, связана со структурой обратного вызова в вашей лямбда-функции.

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

По сути, вам необходимо вернуть объект результата, чтобы он был виден в объекте $context и преобразован как ответ GraphQL JSON вызывающему.

Черт. У меня был "addPost" в преобразователе deletePost. Это действительно отстой, когда все эти функции спрятаны в разных случайных местах веб-консоли AWS. Хотелось бы, чтобы все они были просто в файлах в проекте в VSCode. Почему обратный вызов принимает значение null в качестве первого аргумента. Это помещено в $ context как другое поле?

honkskillet 06.04.2018 00:25

Это часть жизненного цикла обработчика для функции NodeJS в Lambda, которая необходима для того, чтобы у него была точка входа и выхода для вызова вашей функции. Вы можете прочитать об этом здесь: docs.aws.amazon.com/lambda/latest/dg/…

Richard 06.04.2018 22:18

Другие вопросы по теме