Возврат Graphql Не удается вернуть значение NULL для ненулевого поля Query.getDate. Поскольку я новичок в graphql, я хочу знать, неправильный ли мой подход или мой код?

Я создал преобразователь, схему и обработчик, которые будут извлекать некоторые записи из DynamoDB. Теперь, когда я выполняю запрос, я получаю ошибку «Невозможно вернуть значение null для необнуляемого поля Query.getDate». Я хотел бы знать, неверен ли мой подход или в коде требуются какие-либо изменения.

Мой код: https://gist.github.com/vivek-chavan/95e7450ff73c8382a48fb5e6a5b96025

Вход в лямбду:

{
  "query": "query getDate {\r\n      getDate(id: \"0f92fa40-8036-11e8-b106-952d7c9eb822@eu-west-1:ba1c96e7-92ff-4d63-879a-93d5e397b18a\") {\r\n        id\r\n        transaction_date\r\n      }\r\n     }"
}

Ответ :

{
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Query.getDate.",
      "locations": [
        {
          "line": 2,
          "column": 7
        }
      ],
      "path": [
        "getDate"
      ]
    }
  ],
  "data": null
}

Журналы лямбда-функции:

[ { Error: Cannot return null for non-nullable field Query.getDate.
         at completeValue (/var/task/node_modules/graphql/execution/execute.js:568:13)
         at completeValueCatchingError (/var/task/node_modules/graphql/execution/execute.js:503:19)
         at resolveField (/var/task/node_modules/graphql/execution/execute.js:447:10)
         at executeFields (/var/task/node_modules/graphql/execution/execute.js:293:18)
         at executeOperation (/var/task/node_modules/graphql/execution/execute.js:237:122)
         at executeImpl (/var/task/node_modules/graphql/execution/execute.js:85:14)
         at execute (/var/task/node_modules/graphql/execution/execute.js:62:229)
         at graphqlImpl (/var/task/node_modules/graphql/graphql.js:86:31)
         at /var/task/node_modules/graphql/graphql.js:32:223
         at graphql (/var/task/node_modules/graphql/graphql.js:30:10)
       message: 'Cannot return null for non-nullable field Query.getDate.',
       locations: [Object],
       path: [Object] } ],
  data: null }
2019-02-25T10:07:16.340Z    9f75d1ea-2659-490b-ba59-5289a5d18d73    { Item: 
   { model: 'g5',
     transaction_date: '2018-07-05T09:30:31.391Z',
     id: '0f92fa40-8036-11e8-b106-952d7c9eb822@eu-west-1:ba1c96e7-92ff-4d63-879a-93d5e397b18a',
     make: 'moto' } }

Заранее спасибо!

Используйте эту ссылку для схемы, обработчика и преобразователя: gist.github.com/vivek-chavan/95e7450ff73c8382a48fb5e6a5b960‌​25 @k1ck

ABCD 25.02.2019 11:29
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
В этой статье мы рассмотрим, как включить доступ Java Lambda к экземпляру AWS RDS MySQL.
3
1
1 827
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это ваш код:

const data = {
  getDate(args) {
    var params = {
        TableName: 'delete_this',
        Key: {
        "id": args.id
        }
    };
    client.get(params, function(err,data){
        if (err){
        console.info('error occured '+err)
        }else{
        console.info(data)
        }
    });
  },
};
const resolvers = {
  Query: {
    getDate: (root, args) => data.getDate(args),
  },
};

Вы видите эту ошибку, потому что getDate является полем Non-Null в вашей схеме, но оно разрешается в null. Ваш преобразователь должен возвращать либо значение соответствующего типа, либо обещание, которое будет разрешаться в это значение. Если вы измените data вот так

const data = {
  getDate(args) {
    return {
      id: 'someString',
      transaction_date: 'someString',
    }
  }
}

вы увидите, как ошибка исчезнет. Конечно, ваша цель — вернуть данные из вашей базы данных, поэтому нам нужно добавить этот код обратно. Однако ваш существующий код использует обратный вызов. Все, что вы делаете внутри обратного вызова, не имеет значения, потому что он запустил после, который возвращает ваша функция распознавателя. Поэтому вместо этого нам нужно использовать обещание.

Хотя вы можете оберните обратный вызов обещанием, в этом нет необходимости с aws-sdk, поскольку более новые версии поддерживают промисы. Что-то вроде этого должно быть достаточно:

const data = {
  getDate(args) {
    const params = //...
    // must return the resulting Promise here
    return client.get(params).promise().then(result => {
      return {
        // id and transaction_date based on result
      }
    })
  }
}

Или используя синтаксис async/await:

const data = {
  async getDate(args) {
    const params = //...
    const result = await client.get(params).promise()
    return {
      // id and transaction_date based on result
    }
  }
}

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