Возврат Graphql Невозможно вернуть ноль для ненулевого поля Query.getDate.Поскольку я новичок в graphql, я хочу знать, является ли мой подход неправильным или мой код? - PullRequest
0 голосов
/ 25 февраля 2019

Я создал преобразователь, схему и обработчик, которые будут извлекать некоторые записи из DynamoDB.Теперь, когда я выполняю запрос, я получаю «Невозможно вернуть ноль для необнуляемого поля 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' } }

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

1 Ответ

0 голосов
/ 25 февраля 2019

Это ваш код:

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

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

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

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

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

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
    }
  }
}
...