Как правильно отформатировать данные с помощью AppSync и DynamoDB, когда Lambda находится между - PullRequest
0 голосов
/ 26 октября 2018

Получение данных с помощью AppSync непосредственно из DynamoDB, похоже, работает для моего случая, но когда я пытаюсь поместить лямбда-функцию между ними, я получаю сообщения об ошибках "Невозможно разрешить значение (/ issueNewMasterCard / masterCards): типошибка несоответствия, ожидаемый тип LIST "

Глядя на выходные данные сопоставления ответов облачной службы AppSync, я получаю следующее:

 "context": {
        "arguments": {
            "userId": "18e946df-d3de-49a8-98b3-8b6d74dfd652"
        },
        "result": {
            "Item": {
                "masterCards": {
                    "L": [
                        {
                            "M": {
                                "cardId": {
                                    "S": "95d67f80-b486-11e8-ba85-c3623f6847af"
                            },
                                "cardImage": {
                                    "S": "https://s3.eu-central-1.amazonaws.com/logo.png"
                                },
                                "cardWallet": {
                                    "S": "0xFDB17d12057b6Fe8c8c434653456435634565"
                                },...............

вот как я настроил свой шаблон сопоставления ответов:

$utils.toJson($context.result.Item)

Я делаю эту мутацию:

mutation IssueNewMasterCard {
  issueNewMasterCard(userId:"18e946df-d3de-49a8-98b3-8b6d74dfd652"){
    masterCards {
      cardId
    }
  }
}

, и это моя схема:

type User {
    userId: ID!
    masterCards: [MasterCard]
}

type MasterCard {
    cardId: String
}

type Mutation {
    issueNewMasterCard(userId: ID!): User
}

Функция Lambda:

exports.handler = (event, context, callback) => {

    const userId = event.arguments.userId;

         const userParam = {
              Key: {
                 "userId":{S:userId}
              },
              TableName:"FidelityCardsUsers"
             }

      dynamoDB.getItem(userParam, function(err, data) {

        if (err) {
            console.log('error from DynamDB: ',err)
            callback(err);
        } else {
            console.log('mastercards: ',JSON.stringify(data));
            callback(null,data)
        }

 })

1 Ответ

0 голосов
/ 26 октября 2018

Я думаю, проблема в том, что getItem, который вы используете при использовании источника данных DynamoDB, не совпадает с функцией DynamoDB.getItem в aws-sdk.

В частности, похоже, что версия источника данных возвращает уже сформированный ответ (то есть вместо something: { L: [ list of things ] } она просто возвращает something: [ list of things]).

Это важно, потому что это означает, что $utils.toJson($context.result.Item) в вашей текущей настройке возвращает { masterCards: { L: [ ..., поэтому вы видите тип ошибки - masterCards в данном случае это объект с ключом L, а чем массив / список.

Чтобы решить эту проблему в резольвере, вы можете использовать макрос $util.dynamodb.toDynamoDBJson(Object) (https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html#dynamodb-helpers-in-util-dynamodb)., т. Е. Ваш резолвер должен быть:

$util.dynamodb.toDynamoDBJson($context.result.Item)

В качестве альтернативы вы можете захотеть взглянуть на класс AWS.DynamoDB.DocumentClient (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html). Это включает в себя версии getItem и т. Д., Которые автоматически маршалируют и отменяют маршализацию проприетарного DynamoDB, вводящего обратно в нативный JSON. (Честно говоря, я нахожу с этим гораздо приятнее работать и использовать его постоянно).

В этом случае вы можете сохранить свой старый преобразователь, потому что вы будете возвращать объект, где masterCards равен просто массивом JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...